POJ - 1438 One-way Traffic(混合图改有向图)
2015-08-16 00:34
232 查看
题目大意:给出一张混合图,要求你改变尽量多的双向边,使得改变后的图还是强连通的
解题思路:这题和poj-1515类似,只不过这题是混合题,大体思路还是差不多的,在dfs的时候记录一下桥和使用的是哪些边即可
解题思路:这题和poj-1515类似,只不过这题是混合题,大体思路还是差不多的,在dfs的时候记录一下桥和使用的是哪些边即可
[code]#include <cstdio> #include <cstdio> #include <cstring> #define min(a,b)((a) < (b) ? (a) : (b)) #define N 2010 #define M 4000010 struct Edge{ int from, to, dir, next, flag; }E[M]; int head , pre , lowlink ; int tot, dfs_clock, n, m; void dfs(int u, int fa) { pre[u] = lowlink[u] = ++dfs_clock; for (int i = head[u]; i != -1; i = E[i].next) { int v = E[i].to; //flag 为-1表示还没有访问过 if (E[i].flag != -1) continue; if (E[i].dir == 0) continue; //使用了该方向的边,那么另一个方向就设为0,0表示不用 E[i].flag = 1; E[i^1].flag = 0; if (!pre[v]) { dfs(v, u); lowlink[u] = min(lowlink[u], lowlink[v]); if (lowlink[v] > pre[u]) { E[i ^ 1].flag = 1; } } else if (v != fa) { lowlink[u] = min(lowlink[u], pre[v]); } } } void solve() { memset(pre, 0, sizeof(pre)); dfs_clock = 0; for (int i = 1; i <= n; i++) if (!pre[i]) dfs(i, -1); for (int i = 0; i < tot; i += 2) { if (E[i].dir == 2 && E[i].flag == 1 && E[i^1].flag == 1) { printf("%d %d 2\n", E[i].from, E[i].to); } else if (E[i].dir == 2 && E[i].flag == 1 && E[i^1].flag == 0) { printf("%d %d 1\n", E[i].from, E[i].to); } else if (E[i].dir == 2 && E[i].flag == 0 && E[i ^ 1].flag == 1) { printf("%d %d 1\n", E[i^1].from, E[i^1].to); } } } void AddEdge(int u, int v, int dir) { E[tot].from = u; E[tot].to = v; E[tot].dir = dir; E[tot].flag = -1; E[tot].next = head[u]; head[u] = tot++; } void init() { memset(head, -1, sizeof(head)); tot = 0; int a, b, c; for (int i = 0; i < m; i++) { scanf("%d%d%d", &a, &b, &c); if (c == 2) { AddEdge(a, b, c); AddEdge(b, a, c); } else { AddEdge(a, b, c); AddEdge(b, a, 0); } } } int main() { while (scanf("%d%d", &n, &m) != EOF) { init(); solve(); } return 0; }
相关文章推荐
- linux网络编程应该学习哪些东西
- pthread
- C#程序关闭时怎么关闭子线程
- 二分迭代求等比数列和
- 初学Objective - C 第一天
- SPOJ QTREE 树链剖分
- Struts2中关于"There is no Action mapped for namespace / and action name"的总结
- 14、SQL Server 存储过程
- 软件各种版本的含义!例如RC,M,GA等等
- Unity插件之TDTK的学习之个性Towers(三)
- 2015华为软件精英挑战赛德州扑克之后期策略
- 【转帖】常量指针与指针常量的区别
- uva 11552 dp
- <四>java数据结构与算法 插入排序
- POJ - 1515 Street Directions(无向图变有向图)
- yaml
- 面向对象,Java泛型篇
- LeetCode Different Ways to Add Parentheses
- uva 10534 dp
- HDU 1695 GCD (容斥 + 莫比乌斯反演)