题目链接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2155
Emergency
题目大意:给你一个有向图,然后给你q个操作,0代表城堡(点)被占领,(未被占领时,其他点是不能经过该点的,只有被占领了,才能经过该点),如果城堡已经被占领,就输出该城堡被占领,1代表输出x和y的最短距离。
自从做了此题后,我对floyd有了更进一步的了解,每次城堡被占领时,就更新一下该节点就行了。还有就是初始化的问题,一个点到自身的距离为0,不然会wrong呦。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 0xfffffff
using namespace std;
int n,m,q;
int edge[310][310];
int vis[310];
void floyd(int k)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
edge[i][j]=min(edge[i][j],edge[i][k]+edge[k][j]);
}
int main()
{
int T=1;
while(scanf("%d%d%d",&n,&m,&q),n+m+q)
{
int i,j,a,b,c;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
edge[i][i]=0;
edge[i][j]=edge[j][i]=INF;
}
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
edge[a][b]=min(edge[a][b],c);
}
memset(vis,0,sizeof(vis));
printf("Case %d:\n",T++);
for(i=0;i<q;i++)
{
scanf("%d",&a);
if(a==0)
{
scanf("%d",&b);
if(vis[b])
printf("City %d is already recaptured.\n",b);
else
{
vis[b]=1;
floyd(b);
}
}
else
{
scanf("%d%d",&b,&c);
if(!vis[b]||!vis[c])
printf("City %d or %d is not available.\n",b,c);
else if(edge[b][c]==INF)
printf("No such path.\n");
else
printf("%d\n",edge[b][c]);
}
}
printf("\n");
}
return 0;
}

本文详细介绍了如何通过Floyd算法解决有向图中城堡被占领后的最短路径更新问题,包括初始化注意事项及城堡占领操作的实现。
206

被折叠的 条评论
为什么被折叠?



