题目的意思是给定n个顶点m条边,边允许重边,取小值;计算标记点的最短路。有两种询问方式,第一种,就是标记点,第二种就是输出两点间的最短路。
本题是要我们了解floyd的思想,还有就是,本题会爆int。应该用__int64 或long long型;我就被坑了两次;
#include<istream> using namespace std; const int N=309; const int inf=1<<30; int vis[N]; __int64 dp[N][N]; int n,m; void floyd(int k) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(dp[i][j]>dp[i][k]+dp[k][j]) dp[i][j]=dp[i][k]+dp[k][j]; } } } int main() { int q,i,a,b,w,t=1; while(scanf("%d%d%d",&n,&m,&q),n+m+q) { if(t>1) printf(" "); printf("Case %d: ",t++); for(i=0;i<n;i++) { dp[i][i]=0; vis[i]=0; for(int j=i+1;j<n;j++) dp[i][j]=dp[j][i]=inf; } for(i=0;i<m;i++) { scanf("%d%d%d",&a,&b,&w); if(dp[a][b]>w) dp[a][b]=w; } for(i=0;i<q;i++) { scanf("%d",&a); if(!a) { scanf("%d",&b); if(vis[b]) printf("ERROR! At point %d ",b); else { vis[b]=1; floyd(b); } }else { int u,v; scanf("%d%d",&u,&v); if(vis[u]&&vis[v]) { if(dp[u][v]!=inf) printf("%I64d ",dp[u][v]); else printf("No such path "); }else { printf("ERROR! At path %d to %d ",u,v); } } } } return 0; }