zoukankan      html  css  js  c++  java
  • 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...
  • 相关阅读:
    C语言指向指针的指针
    C语言注意事项
    C语言指针
    C语言字符串
    C语言数组
    C语言交换两个数的值
    C语言位运算符
    C语言各种进制输出
    C语言中各种进制的表示
    C 语言sizeof运算符
  • 原文地址:https://www.cnblogs.com/xxx0624/p/2934419.html
Copyright © 2011-2022 走看看