HDU 4738 双连通分量 Caocao's Bridges
2015-08-12 09:32
239 查看
求权值最小的桥,考虑几种特殊情况:
图本身不连通,那么就不用派人去了
图的边双连通分量只有一个,答案是-1
桥的最小权值是0,但是也要派一个人过去
代码君
图本身不连通,那么就不用派人去了
图的边双连通分量只有一个,答案是-1
桥的最小权值是0,但是也要派一个人过去
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <stack> using namespace std; const int maxn = 1000 + 10; const int maxm = 1000000 + 10; int n, m; int cc; int pa[maxn]; int findset(int x) { return x == pa[x] ? x : pa[x] = findset(pa[x]); } void Union(int x, int y) { int px = findset(x), py = findset(y); if(px != py) { pa[px] = py; cc--; } } struct Edge { int v, nxt, w; }edges[maxm * 2]; int ecnt; int head[maxn]; void AddEdge(int u, int v, int d) { edges[ecnt].v = v; edges[ecnt].w = d; edges[ecnt].nxt = head[u]; head[u] = ecnt++; } stack<int> S; bool isbridge[maxm * 2]; int dfs_clock, scc_cnt; int low[maxn], pre[maxn], sccno[maxn]; void dfs(int u, int fa) { pre[u] = low[u] = ++dfs_clock; S.push(u); for(int i = head[u]; ~i; i = edges[i].nxt) { if(i == (fa ^ 1)) continue; int v = edges[i].v; if(!pre[v]) { dfs(v, i); low[u] = min(low[u], low[v]); if(low[v] > low[u]) isbridge[i] = true; } else if(!sccno[v]) low[u] = min(low[u], pre[v]); } if(low[u] == pre[u]) { scc_cnt++; for(;;) { int x = S.top(); S.pop(); sccno[x] = scc_cnt; if(x == u) break; } } } void find_scc() { dfs_clock = scc_cnt = 0; memset(isbridge, false, sizeof(isbridge)); memset(pre, 0, sizeof(pre)); memset(sccno, 0, sizeof(sccno)); for(int i = 1; i <= n; i++) if(!pre[i]) dfs(i, -1); } int main() { while(scanf("%d%d", &n, &m) == 2 && n) { ecnt = 0; memset(head, -1, sizeof(head)); cc = n; for(int i = 1; i <= n; i++) pa[i] = i; while(m--) { int u, v, d; scanf("%d%d%d", &u, &v, &d); Union(u, v); AddEdge(u, v, d); AddEdge(v, u, d); } if(cc > 1) { puts("0"); continue; } find_scc(); if(scc_cnt == 1) { puts("-1"); continue; } int ans = 1000000000; for(int i = 0; i < ecnt; i += 2) if(isbridge[i]) ans = min(ans, edges[i].w); if(!ans) ans = 1; printf("%d\n", ans); } return 0; }
代码君
相关文章推荐
- 超级终端上用不了rz和sz传输文件到ARM板上,还没解决
- ios 画虚线
- APP常用设置尺寸
- JVM 基础知识
- android dalvik浅析一
- 全新整理:微软、谷歌、百度等公司经典面试100题[第101-160题]
- 多线程编程基础知识
- [转]更改ejs模板后缀.ejs为.html
- Quartz 参数说明
- 1029. Median (25)
- redmine 安装实现全过程细节
- DPDK代码内存分析
- 你知道别人怎么看你恢复它?
- 【转】高并发情况下的单例模式
- hdoj继续畅通工程
- JQuery框架之两对小括号()()的理解
- js实现将选中值累加到文本框的方法
- hadoop学习笔记 Hadoop进程
- Quartz异常的一些处理
- hdu 1671 Phone List(字典树·粉刷式标记)