题目地址
题目大意:给出一个无向图n(n<=30)个点m(m<=1000)条边,断开其中的除了1和n之外的其中一个点的所有边,让最短路最长
解题思路:n为30,直接枚举断掉每条边后求结果,取最大即可,注意读懂题意,每次断边后记得恢复
#include <bits/stdc++.h>
using namespace std;
const int maxn = 50;
const int INF = 0xffffff;
__int64 dis[maxn][maxn],mp[maxn][maxn];
int n;
void Floyed()
{
for(int k = 1; k <= n; k++)
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
dis[i][j] = min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
}
int main()
{
int m;
__int64 x,y,z;
while(scanf("%d%d",&n,&m) != EOF)
{
if(!(n+m)) break;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
i==j ? dis[i][j]==0 : dis[i][j] = INF;
i==j ? mp[i][j]==0 : mp[i][j] = INF;
}
}
for(int i = 0; i < m; i++)
{
scanf("%I64d%I64d%I64d",&x,&y,&z);
dis[x][y] = dis[y][x] = z;
mp[x][y] = mp[y][x] = z;
}
int flag = 0;
__int64 minn = -1;
for(int i = 2; i < n; i++)
{
for(int j = 1; j <= n; j++)
{
i==j ? dis[i][j]=0 : dis[i][j]=dis[j][i]=INF;
}
Floyed();
if(dis[1][n] == INF)
{
flag = 1;
break;
}
else
minn = max(minn,dis[1][n]);
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
dis[i][j] = mp[i][j];
}
}
}
if(flag)
puts("Inf");
else
printf("%I64d\n",minn);
}
return 0;
}
本文讨论了一个关于无向图的特定问题,即在给定的无向图中,除起点和终点外,断开任意一个节点的所有边,以使剩余图中的最短路径长度最大化。通过Floyd算法解决此问题,并详细解释了解题步骤。
1506

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



