用的时候太不细心关注细节问题了
#include<iostream>
#include<stdio.h>#include<cstring>
using namespace std;
int map[333][333];
int v[333];
#define INF 999999999
int min(int a,int b)
{
if(a<b)
return a;
return b;
}
int main()
{
int i,j;
int n,m,q,x,y,w,k;
int cas=0;
while(scanf("%d%d%d",&n,&m,&q)!=EOF)
{
cas++;
if(n==0&&m==0&&q==0)
break;
memset(v,0,sizeof(v));
for(i=0;i<n;i++) //有可能存在重边 取最小的边
{
for(j=0;j<n;j++)
map[i][j]=INF;
map[i][i]=0;
}
for(i=0;i<m;i++)
{
scanf("%d%d%d",&x,&y,&w);
if(map[x][y]>w)
map[x][y]=w;
}
printf("Case %d:\n",cas);
while(q--)
{
scanf("%d",&w);
if(w==1) //一开始全没解放 直接输出
{
scanf("%d%d",&x,&y);
if(!v[x]||!v[y])
{
printf("City %d or %d is not available.\n",x,y);
continue;
}
if(map[x][y]!=INF)
printf("%d\n",map[x][y]);
else
printf("No such path.\n");
}
else //用floyd算法 更新通过x点的边的最短路径
{
scanf("%d",&x);
if(v[x])
{
printf("City %d is already recaptured.\n",x);
}
else
{
v[x]=1;
k=x;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(map[i][k]!=INF&&map[k][j]!=INF)// 注意最佳选择是不管解没解放 都要算出来经过k的路程 因为更新非解救城市的时候需要用到
if(map[i][k]+map[k][j]<map[i][j])
{
map[i][j]=map[i][k]+map[k][j];
}
}
}
}
}
printf("\n");
}
return 0;
}