HDU1595

SPFA

题意:给定一张图,从1到n。

求1到n的最短路,但是可能存在某条路被阻断了,即为inf了。

这条路必定是存在最短路中。所以枚举最短路中的路径。。。。

View Code
  1 #include<stdio.h>

  2 #include<string.h>

  3 #include<stdlib.h>

  4 #include<queue>

  5 #include<algorithm>

  6 using namespace std;

  7 const int maxn = 1005;

  8 const int maxm = 1005*500;

  9 const int inf = 9999999;

 10 struct node{

 11     int u,val,next;

 12 }edge[ maxm*2 ];

 13 int head[ maxn ],cnt;

 14 int dis[ maxn ],vis[ maxn ],path[ maxn ];

 15 int n,m,CNT;

 16 struct node22{

 17     int x,y;

 18 }road[ maxn ];

 19 int mat[ maxn ][ maxn ];

 20 void init(){

 21     cnt=0;

 22     CNT=0;

 23     memset( path,-1,sizeof(path) );

 24     memset( head,-1,sizeof( head ));

 25 }

 26 void addedge( int a,int b,int c ){

 27     edge[ cnt ].u=b;

 28     edge[ cnt ].val=c;

 29     edge[ cnt ].next=head[ a ];

 30     head[ a ]=cnt++;

 31 }

 32 void changeit(const int &x, const int &y, int va)  

 33 {  

 34     for( int i=head[x];i!=-1;i=edge[i].next ){

 35         if( edge[i].u==y ){

 36             edge[i].val=va;

 37         }

 38     }

 39 }  

 40 

 41 void spfa( int s ){

 42     for( int i=1;i<=n;i++ ){

 43         dis[i]=inf;

 44         vis[i]=0;

 45         //path[i]=s;

 46     }

 47     queue<int>q;

 48     while( !q.empty() )

 49         q.pop();

 50     vis[s]=1;

 51     dis[s]=0;

 52     q.push( 1 );

 53     while( !q.empty() ){

 54         int now=q.front();

 55         q.pop();

 56         vis[ now ]=0;

 57         for( int i=head[ now ];i!=-1;i=edge[i].next ){

 58             int next=edge[i].u;

 59             if( dis[next]>dis[now]+edge[i].val ){

 60                 dis[next]=dis[now]+edge[i].val;

 61                 path[next]=now;

 62                 if( vis[next]==0 ){

 63                     vis[next]=1;

 64                     q.push(next);

 65                 }

 66             }

 67         }

 68     }

 69     return ;

 70 }

 71 

 72 int main(){

 73     while( scanf("%d%d",&n,&m)!=EOF ){

 74         int a,b,c;

 75         init();

 76         while( m-- ){

 77             scanf("%d%d%d",&a,&b,&c);

 78             addedge( a,b,c );

 79             addedge( b,a,c );

 80             mat[a][b]=mat[b][a]=c;

 81         }

 82         spfa( 1 );

 83         for( int i=n;i!=1;i=path[i] ){

 84             road[ CNT ].x=i;

 85             road[ CNT ].y=path[i];

 86             CNT++;

 87         }

 88         int ans=0;

 89         for(int i = 0; i < CNT; i++){  

 90             changeit(road[i].x, road[i].y, inf);  

 91             changeit(road[i].y, road[i].x, inf);   

 92             spfa(1);  

 93             if(dis[n] > ans&&dis[n]!=inf) ans = dis[n];  

 94             changeit(road[i].x, road[i].y, mat[road[i].x][road[i].y]);  

 95             changeit(road[i].y, road[i].x, mat[road[i].x][road[i].y]);  

 96         }  

 97         printf("%d\n", ans);

 98     }

 99     return 0;

100 }

 

你可能感兴趣的:(HDU)