您的位置:首页 > 其它

POJ 3255(次短路)

2018-02-07 16:29 169 查看
《挑战程序设计竞赛》,初级篇–图

// Dijkstra 次短路
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
#define maxv 5050
#define maxe 1e5+10
#define INF 9999

struct edge
{
int to;
int cost;
};
// first是最短距离,second是顶点的编号
typedef pair<int, int> P;
int N,R;
vector<edge> G[maxv]; // 邻接表
int dist[maxv];  // 最短路
int dist2[maxv]; // 次短路

void slove()
{
priority_queue<P, vector<P>, greater<P> > que;
fill(dist, dist + N, INF);
fill(dist2, dist2 + N, INF);
dist[0] = 0;
que.push(P(0,0));

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("---------------------\n");
printf("次短路:%d\n",dist2[N-1]);
printf("最短路:%d\n",dist[N-1]);
}

int main()
{
cin>>N>>R;
for(int i = 0; i < R; i++)
{
edge e;
int s;
cin>>s>>e.to>>e.cost;
s--; e.to--; // 顶点编号输入[1,N],转换为[0,N-1]
G[s].push_back(e);
swap(s,e.to);
G[s].push_back(e);
}
slove();

return 0;
}
/*
测试数据:
4 4
1 2 100
2 3 250
2 4 200
3 4 100
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: