poj3255 Roadblocks
/* 解析可看: http://blog.csdn.net/arthurfree/article/details/37884463 这次debug时,发现犯了个隐蔽的小错误,让我找了好久才发现... for (int i = 0; i < G[v].size(); i++) 我一开始,把这句里的v,手误打成了i,然后检查时还一直没能发现T^T */
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int N, R;
int f, t, c;
const int MAX_N = 1e5 + 10;
const int INF = 1e6;
struct edge
{
int to, cost;
edge (int t, int c)
{
to = t; cost = c;
}
};
typedef pair <int, int> P;
vector<edge> G[MAX_N]; //图的邻接表表示
int dist[MAX_N]; // 最短距离
int dist2[MAX_N]; // 次短距离
void solve()
{
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; // v为标号,d为出队的边的cost
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); //巧妙,一箭双雕,将判断是否更新次小值时,还要再次用到的d,一并更新,否则要写三变量交换了
que.push( P(dist[e.to], e.to) );
}
if (dist2[e.to] > d2 && d2 > dist[e.to])
{
dist2[e.to] = d2;
que.push( P(dist2[e.to], e.to) );
}
}
}
cout << dist2[N - 1] << endl;
}
int main()
{
cin >> N >> R;
for (int i = 0; i < N; i++)
G[i].clear();
for (int i = 0; i < R; i++)
{
// edge now; int from;
// cin >> from >> now.to >> now.cost;
// G[from].push_back(now);
cin >> f >> t >> c;
f--; t--;
G[f].push_back(edge(t, c));
G[t].push_back(edge(f, c));
}
solve();
return 0;
}

浙公网安备 33010602011771号