zoukankan      html  css  js  c++  java
  • PKU1062+dijkstra

    题意:给定一些点,这些点本身有价值,并且可以同过某些点转化到自身。

    对于lev问题,可以进行枚举出每个点的lev,看哪些点与当前被枚举点是可以相互到达的。这样就解决了点点之间是否可以相互到达问题。

    对于路的权值问题,可以稍微进行转化,在更新dis的时候可以明白。dis[ j ] = min( dis[ j ],dis[ k ]+mat[ k ][ j ] );  //mat[ k ][  j ]:表示k到j的路径花费值

     1 /*
     2 dijkstra
     3 */
     4 #include<stdio.h>
     5 #include<string.h>
     6 #include<stdlib.h>
     7 #include<algorithm>
     8 #include<iostream>
     9 #include<queue>
    10 #include<map>
    11 #include<math.h>
    12 using namespace std;
    13 typedef long long ll;
    14 //typedef __int64 int64;
    15 const int maxn = 105;
    16 const int inf = 99999999;
    17 const double pi=acos(-1.0);
    18 const double eps = 1e-8;
    19 
    20 int mat[ maxn ][ maxn ];
    21 int dis[ maxn ],vis[ maxn ];
    22 struct node{
    23     int lev,price,cnt;
    24     int ex_num[ maxn ],ex_pay[ maxn ];
    25 }tra[ maxn ];
    26 
    27 void dijkstra( int n ){
    28     for( int i=1;i<=n;i++ ){
    29         dis[ i ] = tra[ i ].price;
    30     }
    31     for( int i=1;i<=n;i++ ){
    32         int m,k;
    33         m = inf,k = -1;
    34         for( int j=1;j<=n;j++ ){
    35             if( vis[ j ]==0&&m>dis[ j ] ){
    36                 m = dis[ j ];
    37                 k = j;
    38             }
    39         }
    40         if( k==-1 ) return ;
    41         vis[ k ] = 1;
    42         for( int j=1;j<=n;j++ ){
    43             if( vis[ j ]==0&&mat[k][j]>0 ){
    44                 dis[ j ] = min( dis[ j ],dis[ k ]+mat[ k ][ j ] );
    45             }
    46         }
    47     }
    48 }
    49 
    50 int main(){
    51     int m,n;
    52     while( scanf("%d%d",&m,&n)==2 ){
    53         memset( mat,0,sizeof( mat ) ); 
    54         for( int i=1;i<=n;i++ ){
    55             scanf("%d%d%d",&tra[ i ].price,&tra[ i ].lev,&tra[ i ].cnt);
    56             for( int j=0;j<tra[i].cnt;j++ ){
    57                 scanf("%d%d",&tra[ i ].ex_num[ j ],&tra[ i ].ex_pay[ j ]);
    58                 mat[ tra[i].ex_num[j] ][ i ] = tra[ i ].ex_pay[ j ];
    59             }
    60         }
    61         int res = inf;
    62         for( int i=1;i<=n;i++ ){
    63             for( int j=1;j<=n;j++ ){
    64                 if( tra[ j ].lev>tra[ i ].lev||(tra[i].lev-tra[j].lev)>m )
    65                     vis[ j ] = 1;
    66                 else
    67                     vis[ j ] = 0;
    68             } 
    69             dijkstra( n );
    70             res = min( res,dis[1] );
    71         }
    72         printf("%d\n",res);
    73     }
    74     return 0;
    75 }
    76                  
    View Code
  • 相关阅读:
    Java关键字——instanceof
    C#基础知识整理 IList接口——非泛型
    .Net 中HashTable,HashMap 和 Dictionary<key,value> 和List<T>和DataTable的比较
    JS 判断是否为null
    java数组与字符串相互转换、整型与字符串相互转换
    数组元素的反转
    IOS系统中点击失效
    vue中计算属性和方法的区别,演示代码
    VUE中使用的插件有哪些?为什么,不能自动补全,script,methods和export default?
    【VueJS】实例中data属性的三种写法及区别
  • 原文地址:https://www.cnblogs.com/xxx0624/p/3089777.html
Copyright © 2011-2022 走看看