AOE网上的关键路径——spfa+前向星

来源:互联网 发布:mac死机自动重启 编辑:程序博客网 时间:2024/06/06 09:25

Think:
1知识点:spfa+前向星
2题目分析:字典序最小——逆序建图

——建议参考博客

SDUT题目链接

以下为Accepted代码

#include <bits/stdc++.h>using namespace std;const int Inf = 0x3f3f3f3f;struct node {    int v;    int w;    int next;}edge[50004];queue <int> que;int cnt, head[10004], dis[10004], vis[10004];int pre[10004], in[10004], out[10004];int num, ans[10004];void Add(int u, int v, int w);void spfa(int s, int e, int n);int main(){    int n, m, i, u, v, w;    while(scanf("%d %d", &n, &m) != EOF){        cnt = 0;        memset(head, -1, sizeof(head));        memset(in, 0, sizeof(in));        memset(out, 0, sizeof(out));        while(m--){            scanf("%d %d %d", &u, &v, &w);            Add(v, u, w);            in[u]++, out[v]++;        }        for(i = 1; i <= n; i++){            if(!in[i])                u = i;            if(!out[i])                v = i;        }        spfa(u, v, n);    }    return 0;}void Add(int u, int v, int w){    edge[cnt].v = v;    edge[cnt].w = w;    edge[cnt].next = head[u];    head[u] = cnt++;}void spfa(int s, int e, int n){    int i, u, v;    memset(dis, -Inf, sizeof(dis));    memset(pre, Inf, sizeof(pre));    memset(vis, 0, sizeof(vis));    while(!que.empty()){        que.pop();    }    que.push(s);    dis[s] = 0;    vis[s] = 1;    while(!que.empty()){        u = que.front();        que.pop();        vis[u] = 0;        for(i = head[u]; ~i; i = edge[i].next){            v = edge[i].v;            if(dis[v] < dis[u] + edge[i].w || (dis[v] == dis[u] + edge[i].w && u < pre[v])){                dis[v] = dis[u] + edge[i].w;                pre[v] = u;                if(!vis[v]){                    vis[v] = 1;                    que.push(v);                }            }        }    }    printf("%d\n", dis[e]);    num = 0;    for(i = e; i != Inf; i = pre[i])        ans[num++] = i;    for(i = 1; i < num; i++)        printf("%d %d\n", ans[i-1], ans[i]);}/***************************************************User name: Result: AcceptedTake time: 44msTake Memory: 908KBSubmit time: 2017-07-14 19:35:22****************************************************/
原创粉丝点击