SDUT OJAOE网上的关键路径

来源:互联网 发布:网络借贷的危害 编辑:程序博客网 时间:2024/05/28 15:07

AOE网上的关键路径

Time Limit: 1000MSMemory Limit: 65536KB

Problem Description

    一个无环的有向图称为无环图(Directed Acyclic Graph),简称DAG图。
   
AOE(Activity On Edge)网:顾名思义,用边表示活动的网,当然它也是DAG。与AOV不同,活动都表示在了边上,如下图所示:
                                     

   
如上所示,共有11项活动(11条边),9个事件(9个顶点)。整个工程只有一个开始点和一个完成点。即只有一个入度为零的点(源点)和只有一个出度为零的点(汇点)。
   
关键路径:是从开始点到完成点的最长路径的长度。路径的长度是边上活动耗费的时间。如上图所示,12 579是关键路径(关键路径不止一条,请输出字典序最小的),权值的和为18

Input

    这里有多组数据,保证不超过10组,保证只有一个源点和汇点。输入一个顶点数n(2<=n<=10000),边数m(1<=m <=50000),接下来m行,输入起点sv,终点ev,权值w1<=sv,ev<=n,sv != ev,1<=w <=20)。数据保证图连通。

Output

    关键路径的权值和,并且从源点输出关键路径上的路径(如果有多条,请输出字典序最小的)。

Example Input

9 111 2 61 3 41 4 52 5 13 5 14 6 25 7 95 8 76 8 48 9 47 9 2

Example Output

181 22 55 77 9
spfa算法


#include <iostream>#include <stdio.h>#include <string.h>#include <queue>using namespace std;const int Inf = 0X3f3f3f3f;struct node{    int v, w, next;} s[200001];int dis[200001], vis[200001], head[200001], per[200001], in[200001], out[200001];int n, cut;void add(int u, int v, int w){    s[cut].v = v;    s[cut].w = w;    s[cut].next = head[u];    head[u] = cut++;}void spfa(int ss, int ee){    queue<int>Q;    int i;    for(i = 1; i <= n; i++)    {        dis[i] = -Inf;    }    vis[ss] = 1;    dis[ss] = 0;    Q.push(ss);    while(!Q.empty())    {        int u = Q.front();        Q.pop();        vis[u] = 0;        for(i = head[u]; i != -1; i = s[i].next)        {            int v = s[i].v;            int w = s[i].w;            if(dis[v] < dis[u] + w||(dis[v] == dis[u] + w&&per[v]>u))            {                per[v] = u;                dis[v] = dis[u] + w;                if(!vis[v])                {                    vis[v] = 1;                    Q.push(v);                }            }        }    }    printf("%d\n", dis[ee]);    int t = ee;    while(t != ss)    {        printf("%d %d\n",t, per[t]);        t = per[t];    }}int main(){    int m, u, v, w, i;    while(~scanf("%d %d", &n, &m))    {        memset(in, 0 ,sizeof(in));        memset(out, 0, sizeof(out));        memset(vis, 0, sizeof(vis));        memset(per, -1, sizeof(per));        memset(head, -1, sizeof(head));        cut = 0;        for(i = 0; i < m; i++)        {            cin>>u>>v>>w;            add(v, u, w);            in[u]++;            out[v]++;        }        int ss, ee;        for(i = 1; i <= n; i++)        {            if(in[i] == 0)                ss = i;            if(out[i] == 0)                ee = i;        }        spfa(ss, ee);    }    return 0;}


0 0