bzoj1726 [Usaco2006 Nov]Roadblocks第二短路(spfa)
阿新 • • 發佈:2018-12-31
跟最短路差不多,求次短路就要再記錄一個d2陣列,表示源點到i的次短距離。分類討論維護即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
#define inf 1LL<<60
#define N 5010
#define M 100010
inline int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,m,h[N],num=0;
ll d1[N],d2[N];
bool inq[N];
struct edge{
int to,next,v;
}data[M<<1];
void spfa(){
queue<int>q;
for(int i=1;i<=n;++i) d1[i]=d2[i]=inf;
q.push(1 );inq[1]=1;d1[1]=0;
while(!q.empty()){
int x=q.front();q.pop();inq[x]=0;
for(int i=h[x];i;i=data[i].next){
int y=data[i].to;
if(d1[x]+data[i].v<d1[y]){
d2[y]=d1[y];d1[y]=d1[x]+data[i].v;
if(!inq[y]) q.push(y),inq[y]=1;
}
else if(d1[x]+data[i].v<d2[y]&&d1[x]+data[i].v>d1[y]){//這條邊不是最短路的邊
d2[y]=d1[x]+data[i].v;
if(!inq[y]) q.push(y),inq[y]=1;
}
if(d2[x]+data[i].v<d2[y]){//注意不能else
d2[y]=d2[x]+data[i].v;
if(!inq[y]) q.push(y),inq[y]=1;
}
}
}
}
int main(){
// freopen("a.in","r",stdin);
n=read();m=read();
while(m--){
int x=read(),y=read(),v=read();
data[++num].to=y;data[num].next=h[x];h[x]=num;data[num].v=v;
data[++num].to=x;data[num].next=h[y];h[y]=num;data[num].v=v;
}
spfa();
printf("%lld\n",d2[n]);
return 0;
}