HDU1224 SPFA

题意:给定一张图,求从1到n+1的最长距离。

bfs即可,没什么技巧。

View Code
  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 #include<algorithm>
  5 #include<queue>
  6 #include<stack>
  7 using namespace std;
  8 const int maxn = 105;
  9 const int maxm = 10000;
 10 const int inf = 99999999;
 11 int cnt,head[ maxn ];
 12 struct node{
 13     int u,val,next;
 14 }edge[ maxm ];
 15 int n,m;
 16 int val[ maxn ];
 17 int dis[  maxn ],vis[ maxn ],path[ maxn ];
 18 
 19 void init(){
 20     cnt=0;
 21     memset( head,-1,sizeof( head ));
 22 }
 23 
 24 void addedge( int a,int b,int c ){
 25     edge[ cnt ].u=b;
 26     edge[ cnt ].val=c;
 27     edge[ cnt ].next=head[ a ];
 28     head[ a ]=cnt++;
 29 }
 30 
 31 void bfs(){
 32     for( int i=1;i<=n+1;i++ ){
 33         vis[i]=0;
 34         dis[i]=-inf;
 35         path[i]=-1;
 36     }
 37     queue<int>q;
 38     while( !q.empty() )
 39         q.pop();
 40     q.push( 1 );
 41     vis[1]=1;
 42     dis[1]=0;
 43     while( !q.empty() ){
 44         int now=q.front();
 45         q.pop();
 46         vis[ now ]=0;
 47         for( int i=head[ now ];i!=-1;i=edge[ i ].next ){
 48             int next=edge[i].u;
 49             if( dis[next]<dis[now]+val[next] ){
 50                 dis[next]=dis[now]+val[next];
 51                 path[next]=now;
 52                 if( vis[next]==0 ){
 53                     vis[next]=1;
 54                     q.push(next);
 55                 }
 56             }
 57         }
 58     }
 59 }
 60 void output(){
 61     printf("points : %d\n",dis[n+1]);
 62     stack<int>s;
 63     for( int i=n+1;i!=-1;i=path[i] ){
 64         s.push( i );
 65     }
 66     printf("circuit : ");
 67     printf("%d",s.top());
 68     s.pop();
 69     while( !s.empty() ){
 70         if( s.top()==(n+1) )
 71             printf("->%d",1);
 72         else
 73             printf("->%d",s.top());
 74         s.pop();
 75     }
 76     printf("\n");
 77 }
 78 int main(){
 79     int T;
 80     scanf("%d",&T);
 81     for( int ca=1;ca<=T;ca++ ){
 82         if( ca!=1 )
 83             printf("\n");
 84         scanf("%d",&n);
 85         for( int i=1;i<=n;i++ )
 86             scanf("%d",&val[ i ]);
 87         val[n+1]=0;
 88         scanf("%d",&m);
 89         int a,b;
 90         init();
 91         while( m-- ){
 92             scanf("%d%d",&a,&b);
 93             if( a<b ){
 94                 addedge( a,b,0 );
 95             }
 96             else if( a>b ){
 97                 addedge( b,a,0 );
 98             }
 99         }
100         bfs();
101         printf("CASE %d#\n",ca);
102         //printf("%d\n",dis[n+1]);
103         output();
104     }
105     return 0;
106 }
keep moving...
原文地址:https://www.cnblogs.com/xxx0624/p/2934419.html