题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3631
这题不难,简单的flody算法性质的小应用。话说这题竟然因为PE而错了两次。。竟然不知道PE怎么解决而找的题解。。。。。
代码如下:
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include <map> #include<algorithm> using namespace std; int mp[400][400], vis[400], maxint=100000000; int main() { int n, m, q, x, a, b, c, i, j, k, num=0; while(scanf("%d%d%d",&n,&m,&q)!=EOF&&(n||m||q)) { num++; if(num>1) printf("\n"); printf("Case %d:\n",num); memset(vis,0,sizeof(vis)); for(i=0; i<n; i++) { for(j=0; j<n; j++) { if(i==j) mp[i][j]=mp[j][i]=0; else mp[i][j]=maxint; } } while(m--) { scanf("%d%d%d",&a,&b,&c); if(mp[a][b]>c) mp[a][b]=c; } while(q--) { scanf("%d",&x); if(x) { scanf("%d%d",&a,&b); if(vis[a]==0||vis[b]==0) { printf("ERROR! At path %d to %d\n",a,b); } else { if(mp[a][b]<maxint) printf("%d\n",mp[a][b]); else printf("No such path\n"); } } else { scanf("%d",&a); if(vis[a]) printf("ERROR! At point %d\n",a); else { vis[a]=1; for(i=0; i<n; i++) { for(j=0; j<n; j++) { if(mp[i][j]>mp[i][a]+mp[a][j]) mp[i][j]=mp[i][a]+mp[a][j]; } } } } } } return 0; }