https://vjudge.net/contest/237668#problem/C
题目的意思就是Marica去Mirko的城市找他,走最短路,但有一条路不能走了,求它的最坏情况下的最短路径
思路就是先求出最短路径,然后假设最短路径中的某一条边不能走
#include<stdio.h>
#include<string>
#include<string.h>
#include<iostream>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int n,m,u,v,w;
int a[1020][1020];
int dis[1020];
int vis[1020];
int pre[1010];
void dijkstra(int k)
{
for(int i=1; i<=n; i++)
{
dis[i]=a[1][i];
if(k)pre[i]=1;//记录最短路经过的城市编号
}
memset(vis,0,sizeof(vis));
vis[1]=1;
for(int i=1; i<=n-1; i++)
{
int mmin=inf;
int u=-1;
for(int j=1; j<=n; j++)
{
if(!vis[j]&&dis[j]<mmin)
{
mmin=dis[j];
u=j;
}
}
if(u==-1)
break;
vis[u]=1;
for(int j=1; j<=n; j++)
{
if(!vis[j]&&dis[j]>dis[u]+a[u][j])
{
dis[j]=dis[u]+a[u][j];
if(k)pre[j]=u;
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(a,inf,sizeof(a));
for(int i=1; i<=n; i++)
a[i][i]=0;
int u,v,w;
for(int i=0; i<m; i++)
{
scanf("%d%d%d",&u,&v,&w);
a[u][v]=w;
a[v][u]=w;
}
dijkstra(1);
pre[1]=-1;
int maxn=0;
int r=n;
for(int i=pre[n];i!=-1;i=pre[i])
{
int t=a[i][r];
a[i][r]=a[r][i]=inf;//把一条路堵死
dijkstra(0);//求最短路
maxn=max(maxn,dis[n]);
a[i][r]=a[r][i]=t;
r=i;
}
printf("%d\n",maxn);
}
}
,再求最短路,取这些最短路的最大值即可。