hdu 3631 多源最短路经
/* 碰巧看到,WA很多次,看过别人代码A的 题意: 有向图 当输入0 x 标记x为可以通过的点 当输入1 a b是求出两点之间最短路,必须是过标记过的点 后记: 注意区别有向图和无向图 */ #include <stdio.h> #include <iostream> using namespace std; #define Max 999999999 #define N 305 int edges[N][N]; int visit[N],n; void init() { int i,j; for(i=0;i<n;i++) { for(j=0;j<n;j++){ edges[i][j]=Max; } edges[i][i]=0; visit[i]=0; } } void floyd(int k,int n) { int i,j; for(i=0;i<n;i++) for(j=0;j<n;j++) { if(edges[i][k]+edges[k][j]<edges[i][j]) edges[i][j]=edges[i][k]+edges[k][j]; } } int main() { int m,q,i,j,cas=1,a,b,c; while(scanf("%d %d %d",&n,&m,&q)!=EOF&&(n||m||q)) { if(cas>1) printf("\n"); init(); for(i=0;i<m;i++) { scanf("%d %d %d",&a,&b,&c); if(c<edges[a][b]){ edges[a][b]=c; } }
printf("Case %d:\n",cas++);for(i=0;i<q;i++) { scanf("%d",&a); if(a) { scanf("%d %d",&b,&c); if(!visit[b]||!visit[c]) { printf("ERROR! At path %d to %d\n",b,c); } else { if(edges[b][c]==Max) printf("No such path\n"); else printf("%d\n",edges[b][c]); } } else { scanf("%d",&b); if(!visit[b]) { visit[b]=1; floyd(b,n); } else printf("ERROR! At point %d\n",b); } } } return 0; }