Codevs1269 匈牙利游戏 次短路spfa

来源:互联网 发布:方舟生存进化淘宝 编辑:程序博客网 时间:2024/06/16 18:56

Codevs1269 匈牙利游戏

更新时变为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;}
0 0
原创粉丝点击