AOE网上的关键路径
2016-08-19 11:30
232 查看
AOE网上的关键路径
Time Limit: 1000MS Memory limit: 65536K
题目描述
一个无环的有向图称为无环图(DirectedAcyclic Graph),简称DAG图。
AOE(Activity
On Edge)网:顾名思义,用边表示活动的网,当然它也是DAG。与AOV不同,活动都表示在了边上,如下图所示:
如上所示,共有11项活动(11条边),9个事件(9个顶点)。整个工程只有一个开始点和一个完成点。即只有一个入度为零的点(源点)和只有一个出度为零的点(汇点)。
关键路径:是从开始点到完成点的最长路径的长度。路径的长度是边上活动耗费的时间。如上图所示,1 到2 到 5到7到9是关键路径(关键路径不止一条,请输出字典序最小的),权值的和为18。
输入
这里有多组数据,保证不超过10组,保证只有一个源点和汇点。输入一个顶点数n(2<=n<=10000),边数m(1<=m<=50000),接下来m行,输入起点sv,终点ev,权值w(1<=sv,ev<=n,sv
!= ev,1<=w <=20)。数据保证图连通。
输出
关键路径的权值和,并且从源点输出关键路径上的路径(如果有多条,请输出字典序最小的)。
示例输入
9 11 1 2 6 1 3 4 1 4 5 2 5 1 3 5 1 4 6 2 5 7 9 5 8 7 6 8 4 8 9 4 7 9 2
示例输出
18 1 2 2 5 5 7 7 9
提示
来源
示例程序
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <queue> using namespace std; #define inf 999999 int n, m, k; int path[100010]; //用来存放走过路径的坐标 struct node { int u; int v; int w; }map[100010]; //存放两个节点之间边的信息,包括起始点,结束点,两点之间权值 struct next { int a; int b; }next[100010]; //类似于邻接链表,因为用邻接矩阵超内存 void critical() { next .a = 0; for(int i = 1; i < n; i++) { int flag = 0; for(int j = 0; j < k; j++) { if(next[map[j].v].a - map[j].w < next[map[j].u].a || (next[map[j].v].a - map[j].w == next[map[j].u].a && map[j].v < next[map[j].u].b)) { next[map[j].u].a = next[map[j].v].a - map[j].w; next[map[j].u].b = map[j].v; flag = 1; } } if(flag == 0) break; } cout << -next[1].a << endl; int count = 0, start = 1; path[count++] = 1; while(next[start].b != n) { start = next[start].b; path[count++] = start; } path[count] = n; for(int i = 0; i < count; i++) cout << path[i] << " " << path[i + 1] << endl; } int main() { while(cin >> n >> m) { memset(next, 0, sizeof(next)); memset(path, 0, sizeof(path)); memset(map, 0, sizeof(map)); for(k = 0; k < m; k++) { int x, y, z; cin >> x >> y >> z; map[k].u = x; map[k].v = y; map[k].w = z; } for(int i = 0; i < n; i++) { next[i].a = inf; next[i].b = -1; } critical(); } return 0; }
详细算法见上篇算法前向星
相关文章推荐
- Makefile 编译报错
- Linux下如果忘记MySQL的root密码,可以通过修改配置的方法,重置root密码
- C语言基本教程 第7课:数组和字符串
- 高德地图的No implementation found for 问题解决
- Android 菜单(OptionMenu)大全
- 详解Python实现按任意键继续/退出的功能
- C++语言的表达式模板:表达式模板的入门性介绍
- Zookeeper集群部署
- 巧用jQuery选择器提高写表单效率的方法
- PHP中new static()与new self()的比较
- 浅度体验小米5
- 【笔试】航天飞行器
- iOS开发-时间转换
- View的事件分发机制
- 数据库中cursor游标的概念
- 在图片UIImage上绘制文字(字符串文字转图片)
- LeetCode | Generate Parentheses
- Happy collaboration with Rmd to docx
- tjut 2647
- 标准输入流