PKU : 3255 - Roadblocks
アルゴリズム
基本的にはダイクストラ法で解けます.
ただし, 今回は2番目の最短路なので, いつも bool closed[5002] としているところを, int closed[5002] として, closed が2以上のときは分岐しないようにしました.
プログラム
typedef pair<int,int> P; int main(void){ int n,r; vector<P> t[5002]; scanf("%d%d",&n,&r); rep(i,r){ int a,b,cost; scanf("%d%d%d",&a,&b,&cost); a--; b--; t[a].push_back(P(b,cost)); t[b].push_back(P(a,cost)); } priority_queue<P,vector<P>,greater<P> > open; int closed[5002],dist[5002]; bool firstFlg = false; memset(closed,0,sizeof(closed)); memset(dist,-1,sizeof(dist)); open.push(P(0,0)); while(!open.empty()){ P p = open.top(); open.pop(); if(closed[p.second] >= 2 || dist[p.second] == p.first) continue; closed[p.second]++; dist[p.second] = p.first; if(p.second == n-1){ if(firstFlg){ printf("%d\n",p.first); break; } firstFlg = true; } rep(i,t[p.second].size()){ P next = t[p.second][i]; open.push(P(p.first+next.second,next.first)); } } }