先跑一遍最短路,将最短路的路径记录下来,
然后枚举每一条最短路的边,将其断掉,记录此时的1-n的时间
取其中最大的一个时间即为所求
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int n,m,Cnt,Flag,Ans;
int Head[1005],Dis[1005],Cut[1005][1005],f[1005],Inq[1005];
struct Node{
int to,Next,w;
}e[1000005];
inline void Insert(int u,int v,int w){
e[++Cnt].to = v;
e[Cnt].Next = Head[u];
Head[u] = Cnt;
e[Cnt].w = w;
}
inline void Spfa(){
queue<int> q;
memset(Inq,0,sizeof(Inq));
memset(Dis,INF,sizeof(Dis));
q.push(1);
Dis[1] = 0;
while(!q.empty()){
int u = q.front();
q.pop();
Inq[u] = 0;
for(int i=Head[u];i;i=e[i].Next){
if(Cut[u][e[i].to] == 0 && Dis[e[i].to] > Dis[u] + e[i].w){
if(!Flag)f[e[i].to] = u;
Dis[e[i].to] = Dis[u] + e[i].w;
if(!Inq[e[i].to]){
Inq[e[i].to] = 1;
q.push(e[i].to);
}
}
}
}
}
inline int Read(){
int Out = 0,f = 1;char ch = getchar();
while(!isdigit(ch)){if(ch == ‘-‘)f = -1;ch = getchar();}
while(isdigit(ch)){Out = Out * 10 + ch - ‘0‘;ch = getchar();}
return Out * f;
}
int main(){
n = Read();
m = Read();
for(int i=1;i<=m;i++){
int u = Read(),v = Read(),w = Read();
Insert(u,v,w);
Insert(v,u,w);
}
Spfa();
Flag = 1;
for(int i=n;i!=1;i=f[i]){
Cut[f[i]][i] = 1;
Cut[i][f[i]] = 1;
Spfa();
Cut[f[i]][i] = 0;
Cut[i][f[i]] = 0;
Ans = Ans > Dis[n] ? Ans:Dis[n];
}
printf("%d\n",Ans);
return 0;
}
原文:https://www.cnblogs.com/ainiyuling/p/11188411.html