HDU 4738 双连通分量 Caocao's Bridges
求权值最小的桥,考虑几种特殊情况:
- 图本身不连通,那么就不用派人去了
- 图的边双连通分量只有一个,答案是-1
- 桥的最小权值是0,但是也要派一个人过去
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std; const int maxn = + ;
const int maxm = + ; 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 * ];
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 * ];
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 ^ )) 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 = ;
memset(isbridge, false, sizeof(isbridge));
memset(pre, , sizeof(pre));
memset(sccno, , sizeof(sccno));
for(int i = ; i <= n; i++) if(!pre[i]) dfs(i, -);
} int main()
{
while(scanf("%d%d", &n, &m) == && n)
{
ecnt = ;
memset(head, -, sizeof(head));
cc = n;
for(int i = ; 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 > ) { puts(""); continue; } find_scc(); if(scc_cnt == ) { puts("-1"); continue; } int ans = ;
for(int i = ; i < ecnt; i += ) if(isbridge[i]) ans = min(ans, edges[i].w);
if(!ans) ans = ;
printf("%d\n", ans);
} return ;
}
代码君
HDU 4738 双连通分量 Caocao's Bridges的更多相关文章
- HDU 3394 双连通分量 桥 Railway
第一个答案是统计图中桥的个数 如果一个点-双连通分量中边的个数大于点的个数那么这个块中所有的边都是冲突的,累加到第二个答案中去. #include <iostream> #include ...
- HDU 2242 双连通分量 考研路茫茫——空调教室
思路就是求边双连通分量,然后缩点,再用树形DP搞一下. 代码和求强连通很类似,有点神奇,=_=,慢慢消化吧 #include <cstdio> #include <cstring&g ...
- hdu 4738 (双联通求桥)
2013 ACM/ICPC Asia Regional Hangzhou Online 题目大意:有n个岛,曹操在一些岛之间建了一些桥,每个桥上有一些士兵把守,周瑜只有一个炸弹只能炸掉一个桥,炸弹需要 ...
- HDU 4738 双连通模版题
九野的博客,转载请注明出处:http://blog.csdn.net/acmmmm/article/details/11711577 题意:给定n个点,m条无向边 下面m行表示u , v ,边权值 求 ...
- hdoj 4738 Caocao's Bridges【双连通分量求桥】
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 4738 Caocao's Bridges(Tarjan求桥+重边判断)
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 4738 Caocao's Bridges (tarjan求桥)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意:给一些点,用一些边把这些点相连,每一条边上有一个权值.现在要你破坏任意一个边(要付出相 ...
- HDU 4738——Caocao's Bridges——————【求割边/桥的最小权值】
Caocao's Bridges Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- HDU 4738 Caocao's Bridges(找割边)
HDU 4738 Caocao's Bridges 题目链接 注意几个坑,可能重边,至少要派一个人去炸,没有连通的时候就不用炸了 代码: #include <cstdio> #includ ...
随机推荐
- undefined is not a function
具体报错 TypeError: c:\Users\Administrator\WebstormProjects\blogtest\views\index.ejs:1 >> 1| <% ...
- Ext2文件系统的特点
1.文件更新策略的谨慎实现将系统崩溃的影响减到最少.我们只举一个例子来体现这个优点:例如,当给文件创建一个硬链接时,首先增加磁盘索引节点中 的硬链接计数器,然后把这个新的名字加到合适的目录中.在这种方 ...
- 电话号码 马赛克*号 string类扩展
/// <summary> /// 字符串马赛克 /// </summary> /// <param name="source"></pa ...
- JavaScript_6_函数
函数是由事件驱动的或者当它被调用执行的可重复使用的代码块 调用带参数的函数 带有返回值的函数 <!DOCTYPE html> <html> <head> <t ...
- Python使用easy-install安装时报UnicodeDecodeError的解决方法
Python使用easy-install安装时报UnicodeDecodeError的解决方法,有需要的朋友可以参考下. 问题描述: 在使用easy-install安装matplotlib.pypar ...
- ZOJ 3471 Most Powerful (状压DP,经典)
题意: 有n个原子,每当两个原子碰撞时就会产生能量,并且消耗其中一个原子.已知每两个原子碰撞时消耗其中指定一个原子所产生的能量,问最多能产生多少能量? 思路: 一开始以为是找一个有序序列,使得能量最大 ...
- 将SQL2008升级为SQL2008 r2
我的SQL2008版本信息 Microsoft SQL Server Management Studio 10.0.1600.22 ((SQL_PreRelease).080709-1414 ...
- php有哪些优化技巧
1. echo 比 print 快.2. 使用echo的多重参数代替字符串连接.3. 在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替.4. 对global变 ...
- solver
slover中有type,用于优化算法的选择,有6种: Stochastic Gradient Descent (type: “SGD”), AdaDelta (type: “AdaDelta”), ...
- Java Marker Interface
先看看什么是标记接口?标记接口有时也叫标签接口(Tag interface),即接口不包含任何方法. 在Java里很容易找到标记接口的例子,比如JDK里的Serializable接口就是一个标记接口. ...