1. 程式人生 > >bzoj1726 [Usaco2006 Nov]Roadblocks第二短路(spfa)

bzoj1726 [Usaco2006 Nov]Roadblocks第二短路(spfa)

跟最短路差不多,求次短路就要再記錄一個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; }