1. 程式人生 > >Codevs1269 匈牙利遊戲 次短路spfa

Codevs1269 匈牙利遊戲 次短路spfa

更新時變為3種情況:
1.最短路更新最短路;
2.最短路不能更新最短路但能更新次短路;
3.次短路更新次短路。

思考一下,就顯然了。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <queue>
using namespace std;

#define MAXN (100100)
int V, E, tot = 0;
int first[MAXN], nxt[MAXN<<1], dis1[MAXN], dis2[MAXN];
bool
used[MAXN]; struct edge{ int from, to, cost; }es[MAXN<<1]; void build(int ff, int tt, int dd) { es[++tot] = (edge){ff,tt,dd}; nxt[tot] = first[ff]; first[ff] = tot; } #define INF (1e9) queue <int> q; void sub_spfa(int s) { fill(dis1+1,dis1+V+1,INF); fill(dis2+1,dis2+V+1
,INF); dis1[s] = 0; q.push(s); used[s] = 1; while(q.size()) { int x = q.front(); q.pop(); used[x] = 0; for(int i = first[x]; i != -1; i = nxt[i]) { int v = es[i].to; if(dis1[v] > dis1[x] + es[i].cost) { dis2[v] = dis1[v]; dis1[v] = dis1[x] + es[i].cost; if
(!used[v]) { q.push(v); used[v] = 1; } } else if((dis1[v]<dis1[x]+es[i].cost) && (dis2[v]>dis1[x]+es[i].cost)) { dis2[v] = dis1[x] + es[i].cost; if(!used[v]) { q.push(v); used[v] = 1; } } else if(dis2[v] > dis2[x] + es[i].cost) { dis2[v] = dis2[x] + es[i].cost; if(!used[v]) { q.push(v); used[v] = 1; } } } } } int main() { cin >> V >> E; memset(first,-1,sizeof(first)); for(int i = 1; i <= E; ++ i) { int f,t,d; scanf("%d%d%d", &f, &t, &d); build(f,t,d); } sub_spfa(1); if(dis2[V] < INF) cout << dis2[V] << '\n'; else puts("-1"); return 0; }