hdu 4738 Caocao's Bridges (tarjan求桥)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738
题目大意:给一些点,用一些边把这些点相连,每一条边上有一个权值。现在要你破坏任意一个边(要付出相应边权值的代价),使得至少有两个连通块。输出最小代价值。
算法思路:这题坑多,要考虑仔细:
1.图是边双连通图,就做不到删除一边得到两个连通块,这种情况输出-1.
2.图是连通但不边双联通,就用tarjan找出桥中权值最小的,这里有个巨坑,如果桥最小的权值为0,这时根据题意,要输出1而不是0(看看题就能理解)。
3.图不是连通的,就不需要去删边,即直接输出0。
4.还要注意,输入的边有可能出现重边,这个要特殊标记下。
至于求桥就用tarjan算法就可以标记出。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <queue>
#include <vector>
#include <utility>
using namespace std; const int maxn = ;
const int maxe = 1e6+;
const int INF = 0x3f3f3f3f; //边的双连通分量
int pre[maxn],low[maxn],dfs_clock; struct Edge{
int u,v,w;
int next;
}edges[maxe*];
int head[maxn],cnt; bool flag;
int Min;
int G[maxn][maxn]; void addedge(int u,int v,int w){
edges[cnt].u = u;edges[cnt].v = v;edges[cnt].w = w;edges[cnt].next = head[u];
head[u] = cnt++;
edges[cnt].u = v;edges[cnt].v = u;edges[cnt].w = w;edges[cnt].next = head[v];
head[v] = cnt++;
}
void tarjan(int u,int fa){
pre[u] = low[u] = dfs_clock++;
for(int i=head[u];i!=-;i=edges[i].next){
int v = edges[i].v;
if(!pre[v]){
tarjan(v,u);
low[u] = min(low[u],low[v]);
if(low[v] > pre[u] && G[u][v] == ) { //要判断没有重边
flag = true;
Min = min(Min,edges[i].w);
}
}
else if(pre[v] < pre[u] && v != fa) //u->v是反向边;
low[u] = min(low[u],pre[v]);
}
} int main()
{
//freopen("E:\\acm\\input.txt","r",stdin); int N,M;
while(cin>>N>>M && N+M){
memset(pre,,sizeof(pre));
memset(head,-,sizeof(head));
memset(G,,sizeof(G));
cnt = ;
dfs_clock = ;
for(int i=;i<=M;i++){
int u,v,w; scanf("%d %d %d",&u,&v,&w);
G[u][v]++; //标记是否出现重边
G[v][u]++;
addedge(u,v,w);
}
Min = INF;
flag = false;
tarjan(,-); bool f = ;
for(int i=;i<=N;i++){
if(!pre[i]){
f = true;
break;
} }
if(f){ //图不是连通的
printf("0\n");
continue;
} if(!flag){ //图是边双连通的
printf("-1\n");
}
else{
if(Min == ) printf("1\n");
else printf("%d\n",Min);
}
} }
hdu 4738 Caocao's Bridges (tarjan求桥)的更多相关文章
- Hdu 4738 Caocao's Bridges (连通图+桥)
		
题目链接: Hdu 4738 Caocao's Bridges 题目描述: 有n个岛屿,m个桥,问是否可以去掉一个花费最小的桥,使得岛屿边的不连通? 解题思路: 去掉一个边使得岛屿不连通,那么去掉的这 ...
 - 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  ——(找桥,求联通块)
		
题意:给你一个无向图,给你一个炸弹去炸掉一条边,使得整个图不再联通,你需要派人去安置炸弹,且派去的人至少要比这条边上的人多.问至少要派去多少个,如果没法完成,就输出-1. 分析:如果这个图是已经是多个 ...
 - HDU 4738 Caocao's Bridges(Tarjan)
		
题目链接 #include <iostream> #include <cstring> #include <cstdio> #include <queue&g ...
 - kuangbin专题 专题九 连通图 HDU 4738 Caocao's Bridges
		
题目链接:https://vjudge.net/problem/HDU-4738 题目:tarjan求桥,坑点: 题目说是分岛任务...如果所有岛之间没有完全连通,就不需要执行任务了...答案直接是0 ...
 - hdu 4738 Caocao's Bridges(割边)
		
题目链接 用tarjan求桥上的最小权值 #include<bits/stdc++.h> #define ll long long int using namespace std; inl ...
 - 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 (2013杭州网络赛1001题,连通图,求桥)
		
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
 - 2013杭州网赛 1001 hdu 4738 Caocao's Bridges(双连通分量割边/桥)
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题意:有n座岛和m条桥,每条桥上有w个兵守着,现在要派不少于守桥的士兵数的人去炸桥,只能炸一条桥 ...
 
随机推荐
- delphi 编写一个dos 窗体
			
+ //dos 仿真程序 delphi 窗体实现! function GetDosOutput(CommandLine: string; Work: string = 'C:\'): string ...
 - jQuery 杂项方法
			
jQuery 杂项方法 方法 描述 data() 向被选元素附加数据,或者从被选元素获取数据 each() 为每个匹配元素执行函数 get() 获取由选择器指定的 DOM 元素 index() 从匹配 ...
 - Child&ElementChild
			
关于firstChild&firstElementChild及其同类属性使用,同时分析不同浏览器下child的包含的节点差异 <head> <meta charset=&qu ...
 - Maven项目的目录结构
			
刚接触Maven没多长时间,实习时在的小公司很不规范,所有web项目都是dynamic web project搭建,没有用到项目构建,管理工具,导致了非常多的重复工作与低效. 先来看看Maven的功能 ...
 - video,source元素
			
一,视频 <video src="../[再一次快乐结局]第15集.mp4" controls="controls" width="500&qu ...
 - javascript闭包传参和事件的循环绑定
			
今天看到一个javascript的题目,按常理循环绑定事件,但是得到的结果却不是想要的. <a href="#">text</a><br>< ...
 - ng-form
			
form提供的属性都是用来表示表单的验证状态的,包括:$pristine(表单没有填写记录).$dirty(表单有填写记录).$valid(通过验证).$invalid(未通过验证).$error(验 ...
 - 黑马程序员——vim编辑器的使用
			
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.基本操作 1.从命令提示符进入vim编辑器: vim filename <ENTE ...
 - Codeforces Round #207 (Div. 2)
			
A:超级大水题: 代码: #include<cstdio> #define maxn 105 using namespace std; int n,a[maxn],x,y,ans; int ...
 - socket.io发送给指定的客户端
			
http://www.cnblogs.com/ajccom/archive/2013/07/18/3197809.html http://stackoverflow.com/questions/100 ...