• CSU1321+SPFA


    简单题

      1 /*
      2 简单的bfs
      3 */
      4 #include<algorithm>
      5 #include<iostream>
      6 #include<string.h>
      7 #include<stdlib.h>
      8 #include<stdio.h>
      9 #include<math.h>
     10 #include<queue>
     11 #include<stack>
     12 #include<map>
     13 #include<set>
     14 using namespace std;
     15 typedef long long int64;
     16 //typedef __int64 int64;
     17 typedef pair<int64,int64> PII;
     18 #define MP(a,b) make_pair((a),(b)) 
     19 const int inf = 0x3f3f3f3f;
     20 const double pi=acos(-1.0);
     21 const int dx[]={1,-1,0,0};
     22 const int dy[]={0,0,1,-1};
     23 const double eps = 1e-8;
     24 const int maxm = 1000005;
     25 const int maxn = 1005;
     26 struct Edge{
     27     int u,v,next,val;
     28 }edge[ maxm*2 ];
     29 int cnt ,head[ maxn ];
     30 bool vis[ maxn ];
     31 int dis1[ maxn ],dis2[ maxn ],girl[ maxn ];
     32 //int dp[ maxn ];
     33 queue<int>q;
     34 //int pre[ maxn ];
     35 void init(){
     36     cnt = 0;
     37     memset( head,-1,sizeof( head ) );
     38 }
     39 void addedge( int a,int b,int c ){
     40     edge[ cnt ].u = a;
     41     edge[ cnt ].v = b;
     42     edge[ cnt ].val = c;
     43     edge[ cnt ].next = head[ a ];
     44     head[ a ] = cnt ++;
     45 }
     46 
     47 int spfa( int n ){
     48     while( !q.empty() )
     49         q.pop();
     50     //memset( pre,-1,sizeof( pre ) );
     51     memset( vis,false,sizeof( vis ) );
     52     memset( dis1,0x3f,sizeof( dis1 ) );
     53     memset( dis2,0x3f,sizeof( dis2 ) );
     54     vis[ 1 ] = true;
     55     q.push( 1 );
     56     dis1[ 1 ] = 0;
     57     dis2[ 1 ] = girl[ 1 ];
     58     //for( int i=head[1];i!=-1;i=edge[i].next ){
     59     //    pre[ edge[i].v ] = 1;
     60     //}
     61     while( !q.empty() ){
     62         int cur = q.front();
     63         q.pop();
     64         vis[ cur ] = false;
     65         for( int i=head[cur];i!=-1;i=edge[i].next ){
     66             int nxt = edge[ i ].v;
     67             if( dis1[nxt]>dis1[cur]+edge[i].val ){
     68                 dis1[nxt] = dis1[cur]+edge[i].val;
     69                 //pre[ nxt ] = cur;
     70                 dis2[nxt] = dis2[cur]+girl[edge[i].v];
     71                 if( !vis[nxt] ){
     72                     vis[nxt] = true;
     73                     q.push( nxt );
     74                 }
     75             }
     76             else if( dis1[nxt]==dis1[cur]+edge[i].val ){
     77                 if( dis2[nxt]<dis2[cur]+girl[edge[i].v] ){
     78                     //pre[ nxt ] = cur;
     79                     dis2[nxt]=dis2[cur]+girl[edge[i].v];
     80                     if( !vis[nxt] ){
     81                         vis[nxt] = true;
     82                         q.push( nxt );
     83                     }
     84                 }
     85             }
     86         }
     87     }
     88     //printf("dis1[ %d ] = %d
    ",n,dis1[n]);
     89     if( dis1[n]>=0x3f3f3f3f ) return -1;
     90     else return dis2[ n ];
     91     /*
     92     int ans = 0;
     93     int cur = n;
     94     while( 1 ){
     95         ans += girl[ cur ];
     96         cur = pre[ cur ];
     97         if( cur==-1 ){
     98             break;
     99         }
    100     }
    101     return ans;
    102     */
    103 }
    104     
    105 int main(){
    106     int n;
    107     while( scanf("%d",&n)==1 ){
    108         int m;
    109         scanf("%d",&m);
    110         for( int i=1;i<=n;i++ )
    111             scanf("%d",&girl[i]);
    112         int a,b,c;
    113         init();
    114         while( m-- ){
    115             scanf("%d%d%d",&a,&b,&c);
    116             //if( a==b ) continue;
    117             addedge( a,b,c );
    118             addedge( b,a,c );
    119         }
    120         printf("%d
    ",spfa( n ) );
    121     }
    122     return 0;
    123 }
    View Code
    keep moving...
  • 相关阅读:
    1、手把手教React Native实战之环境搭建
    0、手把手教React Native实战之开山篇
    完整软件项目开发周期介绍
    闲暇决定个人的前程
    长期优秀的人,可能优秀只是他的习惯
    如何进行项目管理
    精选后端开发技巧大集合
    你的代码里藏着你的优雅
    人生就是一场永不停歇的修行
    写给女程序员的一篇文章
  • 原文地址:https://www.cnblogs.com/xxx0624/p/3350640.html
Copyright © 2020-2023  润新知