hdu 3631(floyd思想的运用)

来源:互联网 发布:python def的作用 编辑:程序博客网 时间:2024/05/29 16:11

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3631

思路:由于只能用标记的点去更新,并且又要求任意两点之间的最短距离,显然floyd是最合适的。

 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #include<vector> 7 using namespace std; 8 #define MAXN 333 9 #define inf 1<<3010 bool mark[MAXN];11 int map[MAXN][MAXN];12 int N,M,Q;13 14 void Floyd(int x){15     for(int i=0;i<N;i++){16         for(int j=0;j<N;j++){17             if(map[i][x]!=inf&&map[x][j]!=inf&&map[i][j]>map[i][x]+map[x][j]){18                 map[i][j]=map[i][x]+map[x][j];19             }20         }21     }22 }23 24 25 int main(){26     int _case=1,u,v,w,x,y,flag;27     while(~scanf("%d%d%d",&N,&M,&Q),(N+M+Q)){28         if(_case>1)puts("");29         for(int i=0;i<N;i++){30             map[i][i]=0;31             for(int j=i+1;j<N;j++){32                 map[i][j]=map[j][i]=inf;33             }34         }35         for(int i=1;i<=M;i++){36             scanf("%d%d%d",&u,&v,&w);37             if(w<map[u][v])map[u][v]=w;38         }39         memset(mark,false,sizeof(mark));40         printf("Case %d:\n",_case++);41         while(Q--){42             scanf("%d",&flag);43             if(flag==0){44                 scanf("%d",&x);45                 if(mark[x]){ printf("ERROR! At point %d\n",x);continue; }46                 mark[x]=true;47                 Floyd(x);48             }else {49                 scanf("%d%d",&x,&y);50                 if(!mark[x]||!mark[y]){51                     printf("ERROR! At path %d to %d\n",x,y);52                 }else if(map[x][y]<inf){53                     printf("%d\n",map[x][y]);54                 }else 55                     puts("No such path");56             }57         }58     }59     return 0;60 }
View Code

 

0 0