最短路问题。先找出1-n的最短路,依次把路上的一条路径去掉,求出并记录最短路,取最大值。
注意:去掉某一条路径时要先恢复上一条路径。
#include<cstdio>
#include<queue>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1000+5,maxm=500000+5;
int n,m,s,t;
bool vis[maxn],flag;
int tot=0,first[maxn],next[maxm<<1],dis[maxn];
int fa[maxn],fatot[maxm<<1];
queue<int>q;
struct edge
{
int f,t,v;
}es[maxm<<1];
void build(int f,int t,int v)
{
es[++tot]=(edge){f,t,v};
next[tot]=first[f];
first[f]=tot;
}
void spfa(int s)
{
memset(vis,0,sizeof(vis));memset(dis,0x3f3f3f3f,sizeof(dis));
q.push(s);
dis[s]=0;
vis[s]=1;
while(!q.empty())
{
int v=q.front();
q.pop();
vis[v]=0;
for(int i=first[v];i;i=next[i])
{
int u=es[i].t;
if(dis[u]>dis[v]+es[i].v)
{
dis[u]=dis[v]+es[i].v ;
if(flag==1)
{
fatot[u]=i;//bian
fa[u]=v;//dian
}
if(!vis[u])
{
q.push(u);
vis[u]=1;
}
}
}
}
}
int main()
{
memset(fa,0,sizeof(fa));
int a,b,c;
scanf("%d%d",&n,&m);
s=1;
t=n;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
build(a,b,c);
build(b,a,c);
}
flag=1;
spfa(s);
flag=0;
int ans=0;
for(int i=n;i!=1;i=fa[i])
{
int bian=fatot[i];
int dfg=es[bian].v;
es[bian].v=0x3f3f3f3f;
spfa(s);
ans=max(ans,dis[t]);
es[bian].v=dfg;
}
cout<<ans;
return 0;
}