1. 程式人生 > >洛谷P2865 [USACO06NOV]路障Roadblocks 次短路

洛谷P2865 [USACO06NOV]路障Roadblocks 次短路

++ out block www 次短路 first inf pair 維護

傳送門

到頂點v的次短路有兩種情況:

(1)到u的最短路+d(u,v);

(2)到u的次短路+d(u,v);

dis[]表示最短路的數組,dis2[]是次短路的數組,然後用優先隊列維護這兩個數組

對已經求得的到u的路徑長z:

(1)如果z<dis[v]&&z<dis2[v]:把dis2[v]賦值為dis[v],dis[v]賦值為z,dis[v],dis2[v]進隊列

(2)如果z<dis2[v]&&z>dis[v]:把dis2[v]更新為z,dis2[v]進隊列

#include<iostream>
#include<vector>
#include
<queue> using namespace std; int n,m; const int inf=99999999; vector<pair<int,int> >g[5005]; priority_queue<pair<int,int> >q; int book[5005],dis[5005],dis2[5005]; void swap(int &x,int &y) { int t=x; x=y; y=t; } void dijkstra() { int i,t; for(i=1;i<=n;i++){ dis[i]
=inf; dis2[i]=inf; } dis[1]=0; q.push(make_pair(0,1)); while(q.size()) { pair<int,int>r=q.top(); q.pop(); int x=r.second; if(dis2[x]<-r.first)continue; for(i=0;i<g[x].size();i++) { int y,z; y
=g[x][i].second; z=-r.first+g[x][i].first; if(z<dis[y]&&z<dis2[y]) { dis2[y]=dis[y]; dis[y]=z; q.push(make_pair(-dis[y],y)); q.push(make_pair(-dis2[y],y)); } if(z<dis2[y]&&z>dis[y]) { dis2[y]=z; q.push(make_pair(-dis2[y],y)); } } } } void solve() { cin>>n>>m; for(int i=1;i<=m;i++) { int a,b,c; cin>>a>>b>>c; g[a].push_back(make_pair(c,b)); g[b].push_back(make_pair(c,a)); } dijkstra(); cout<<dis2[n]<<endl; } int main() { solve(); }

洛谷P2865 [USACO06NOV]路障Roadblocks 次短路