题目链接:http://poj.org/problem?id=3255
题意:
主人公想要找到一条道目的地的次短路径,问次短路径的长度为多少。这题裸次短路,直接套模板即可。
代码:
#include <cstdio>
#include <iostream>
#include <queue>
#include <vector>
#define N 5005
#define INF (1 << 28)
#define fp(_p,_r,_q) for(int _p=_r;_p<_q;_p++)
#define E 100005
using namespace std;
typedef pair<int,int> P;
struct cmp{
bool operator()(P p1,P p2){
return p1.first > p2.first;
}
};
struct edge{
int to,cost;
edge(int to,int c):to(to),cost(c){}
edge(){}
};
int n,e;
vector <edge> G[N];
long long d[N],d1[N];
void solve(){
priority_queue<P,vector<P>,cmp> q;
while(!q.empty()) q.pop();
fill(d,d + n,INF);
fill(d1,d1 + n,INF);
d[0] = 0;
q.push(P(0,0));
while(!q.empty()){
P p = q.top(); q.pop();
int v = p.second;
long long di = p.first;
if(d1[v] < di) continue;
fp(i,0,G[v].size()){
edge e = G[v][i];
long long di1 = di + e.cost;
if(d[e.to] > di1){
swap(d[e.to],di1);
q.push(P(d[e.to],e.to));
}
if(d1[e.to] > di1 && d[e.to] < di1){
d1[e.to] = di1;
q.push(P(d1[e.to],e.to));
}
}
}
cout << d1[n - 1] << endl;
}
int main(void)
{
scanf("%d%d",&n,&e);
fp(i,0,e){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
G[-- a].push_back(edge(-- b,c));
G[b].push_back(edge(a,c));
}
solve();
return 0;
}