您的位置:首页 > 其它

poj 3255 Roadblocks(次短路)

2015-08-10 13:18 453 查看
题意:一幅带权无向图求次短路;

思路:每次维护最短路和次短路,先更新最短再更新次短;求次短路径的长度;

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
typedef pair<int,int>P;
int N,R;
struct edge{
int to,cost;
edge(int a,int b){
to=a;cost=b;
}
};
vector<edge> G[500010];
int dist[500010];  //最短路
int dist2[500010]; //次短路
void solve(){
priority_queue<P,vector<P>,greater<P> > que;
fill(dist+1,dist+N+1,INF);
fill(dist2+1,dist2+N+1,INF);
dist[1]=0;
que.push(P(0,1));
while(!que.empty()){
P p=que.top();que.pop();
int v=p.second,d=p.first;
if(dist2[v]<d) continue;
for(int i=0;i<G[v].size();i++){
edge &e=G[v][i];
int d2=d+e.cost;
if(dist[e.to]>d2){
swap(dist[e.to],d2);
que.push(P(dist[e.to],e.to));
}
if(dist2[e.to]>d2&&dist[e.to]<=d2){
dist2[e.to]=d2;
que.push(P(dist2[e.to],e.to));
}
}
}
printf("%d\n",dist2
);
}
int main()
{
int i,j,k,a,b,c;
while(scanf("%d%d",&N,&R)!=EOF){
memset(G,0,sizeof(G));
for(i=0;i<R;i++){
scanf("%d%d%d",&a,&b,&c);
G[a].push_back(edge(b,c));
G[b].push_back(edge(a,c));
}
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: