题不难,但是省赛总有一个特点那就是坑,掉进去出不来,输入路径a[1][2]=1 还会有a[1][2]=2,应该用a[1][2]=1;
重新理解了floyd算法
#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include<string.h>
#include <set>
#define INF 0xfffffff
using namespace std;
int path[350][350];
bool visit[350];
int N,M,Q;
void floyd(int k)
{
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
{
path[i][j]=min(path[i][k]+path[k][j],path[i][j]);
}
}
int main()
{
int cnt=1;
while(~scanf("%d%d%d",&N,&M,&Q))
{
if(N==0&&M==0&&Q==0)break;
printf("Case %d:\n",cnt++);
int x,y,z;
for(int i=0; i<N; i++)
for(int j=i+1; j<N; j++)
{
path[i][i]=0;
path[i][j]=path[j][i]=INF;
}
memset(visit,0,sizeof(visit));
for(int i=1; i<=M; i++)
{
scanf("%d%d%d",&x,&y,&z);
path[x][y]=min(path[x][y],z);
}
for(int i=1; i<=Q; i++)
{
scanf("%d",&x);
if(x==0)
{
scanf("%d",&y);
if(visit[y])printf("City %d is already recaptured.\n",y);
else
{
visit[y]=1;
floyd(y);
}
}
else
{
scanf("%d%d",&y,&z);
if(visit[y]&&visit[z])
{
if(path[y][z]==INF)printf("No such path.\n");
else printf("%d\n",path[y][z]);
}
else printf("City %d or %d is not available.\n",y,z);
}
}
printf("\n");
}
return 0;
}