Caocao's Bridges

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 1231    Accepted Submission(s): 478

Problem Description
Caocao was defeated by Zhuge Liang and Zhou Yu in the battle of Chibi. But he wouldn't give up. Caocao's army still was not good at water battles, so he came up with another idea. He built many islands in the Changjiang river, and based on those islands, Caocao's
army could easily attack Zhou Yu's troop. Caocao also built bridges connecting islands. If all islands were connected by bridges, Caocao's army could be deployed very conveniently among those islands. Zhou Yu couldn't stand with that, so he wanted to destroy
some Caocao's bridges so one or more islands would be seperated from other islands. But Zhou Yu had only one bomb which was left by Zhuge Liang, so he could only destroy one bridge. Zhou Yu must send someone carrying the bomb to destroy the bridge. There might
be guards on bridges. The soldier number of the bombing team couldn't be less than the guard number of a bridge, or the mission would fail. Please figure out as least how many soldiers Zhou Yu have to sent to complete the island seperating mission.
 
Input
There are no more than 12 test cases.



In each test case:



The first line contains two integers, N and M, meaning that there are N islands and M bridges. All the islands are numbered from 1 to N. ( 2 <= N <= 1000, 0 < M <= N2 )



Next M lines describes M bridges. Each line contains three integers U,V and W, meaning that there is a bridge connecting island U and island V, and there are W guards on that bridge. ( U ≠ V and 0 <= W <= 10,000 )



The input ends with N = 0 and M = 0.
 
Output
For each test case, print the minimum soldier number Zhou Yu had to send to complete the mission. If Zhou Yu couldn't succeed any way, print -1 instead.
 
Sample Input
3 3
1 2 7
2 3 4
3 1 4
3 2
1 2 7
2 3 4
0 0
 
Sample Output
-1
4
 
Source

图的连通性问题~之求桥模板

#include "stdio.h"  //本人觉得两点之间可能有多条边,这样的话,邻接矩阵就没法存了,转邻接表~
#include "string.h" #define N 1005
#define INF 0x3fffffff struct node
{
int x,y;
int weight;
int next;
}edge[4*N*N];
int idx,head[N]; int set[N]; //并查集用 int root; bool mark[N],visit[N];
int low[N],dfn[N];
int stackk[4*N*N],num; int MIN(int a,int b){ return a<b?a:b; }
void Init(){ idx=0; memset(head,-1,sizeof(head)); }
int find(int x){ return set[x]==x?set[x]:set[x]=find(set[x]); } void Add(int x,int y,int weight)
{
edge[idx].x = x;
edge[idx].y = y;
edge[idx].weight = weight;
edge[idx].next = head[x];
head[x] = idx++;
} void Union(int x,int y)
{
int fa = find(x);
int fb = find(y);
if(fa!=fb)
set[fa] = fb;
} void DFS(int x,int times,int edge_father)
{
int i,y;
int child=0;
visit[x] = true;
low[x] = dfn[x] = times;
for(i=head[x]; i!=-1; i=edge[i].next)
{
y=edge[i].y;
if(!visit[y])
{
child++;
DFS(y,times+1,i);
low[x] = MIN(low[x],low[y]);
//if(x==root && child==2) mark[root] = true; //记录顶点是否为割顶
//if(x!=root && low[y]>=dfn[x]) mark[x] = true; //记录顶点是否为割顶
if(low[y]>dfn[x]) stackk[num++] = i; //若边i为桥,存入stackk[];
}
else if(edge_father!=-1 && i!=(edge_father^1)) //若当前边不为原来他father到他的边,更新low[x];
low[x] = MIN(low[x],dfn[y]);
}
} int solve(int n)
{
int i,ans = INF;
num = 0;
memset(visit,false,sizeof(visit)); //标记点是否已访问
//memset(mark,false,sizeof(mark));
root = 1;
int times = 1;
DFS(root,times,-1);
for(i=0; i<num; ++i)
ans = MIN(ans,edge[stackk[i]].weight);
if(ans==INF) ans=-1; //不存在桥,ans=-1;
if(ans==0) ans++; //如果桥权值是零,则最少要派一人去炸桥
return ans;
} int main()
{
int i;
int n,m;
int x,y,k;
while(scanf("%d %d",&n,&m),n&&m)
{
Init();
for(i=1; i<=n; ++i) set[i] = i; //并查集用
while(m--)
{
scanf("%d %d %d",&x,&y,&k);
if(x==y) continue;
Add(x,y,k);
Add(y,x,k);
Union(x,y); //合并两点
}
bool flag = true;
for(i=1; i<=n; ++i) //有一个点不连通,则flag为false;
{
if(find(i) != find(1))
flag = false;
}
if(!flag){ printf("0\n"); continue; }
printf("%d\n",solve(n));
}
return 0;
}

//后加上的代码~~

#include "stdio.h"
#include "string.h" #define N 1010
#define INF 0x3fffffff struct node
{
int x,y;
bool visit;
int weight;
int next;
}edge[2*N*N];
int idx,head[N]; int n,m;
int time;
int low[N],dfn[N];
bool mark[N];
int st[2*N*N],num; //存割边的编号 int MIN(int x,int y){ return x<y?x:y; }
void Init(){idx=0; memset(head,-1,sizeof(head)); }
void Add(int x,int y,int k)
{
edge[idx].x = x;
edge[idx].y = y;
edge[idx].visit = false; //该条边未被访问
edge[idx].weight = k;
edge[idx].next = head[x];
head[x] = idx++;
} int set[N];
int find(int x);
void Union(int x,int y); void DFS(int x)
{
int i,y;
low[x] = dfn[x] = ++time;
for(i=head[x]; i!=-1; i=edge[i].next)
{
y = edge[i].y;
if(edge[i].visit) continue; //该边已经访问过,continue;
edge[i].visit = edge[i^1].visit = true;
if(!dfn[y])
{
DFS(y);
low[x] = MIN(low[x],low[y]);
if(low[y]>dfn[x])
st[num++] = i;
}
else
low[x] = MIN(low[x],dfn[y]);
}
} int Solve()
{
int ans = INF;
int i,j;
time = 0;
num = 0;
memset(dfn,0,sizeof(dfn));
DFS(1);
for(i=0; i<num; ++i)
{
if(ans>edge[st[i]].weight)
ans = edge[st[i]].weight;
}
if(ans==INF) ans=-1;
if(ans==0) ans=1;
return ans;
} int main()
{
bool flag;
int i,j;
int x,y,k;
while(scanf("%d %d",&n,&m),n||m)
{
Init();
for(i=1; i<=n; ++i) set[i] = i;
for(i=1; i<=m; ++i)
{
scanf("%d %d %d",&x,&y,&k);
Add(x,y,k);
Add(y,x,k);
Union(x,y);
}
flag = true;
for(i=1; i<=n; ++i)
{
if(find(i)!=find(1))
flag = false;
}
if(!flag) { printf("0\n"); continue; } //图不连通,派0个人去
printf("%d\n",Solve());
}
return 0;
} int find(int x)
{
return set[x]==x?set[x]:set[x]=find(set[x]);
}
void Union(int x,int y)
{
int fa = find(x);
int fb = find(y);
if(fa!=fb)
set[fa] = fb;
}

hdu 4738 Caocao's Bridges 图--桥的判断模板的更多相关文章

  1. hdu 4738 Caocao's Bridges(桥的最小权值+去重)

    http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意:曹操有一些岛屿被桥连接,每座都有士兵把守,周瑜想把这些岛屿分成两部分,但他只能炸毁一条桥,问最少 ...

  2. Hdu 4738 Caocao's Bridges (连通图+桥)

    题目链接: Hdu 4738 Caocao's Bridges 题目描述: 有n个岛屿,m个桥,问是否可以去掉一个花费最小的桥,使得岛屿边的不连通? 解题思路: 去掉一个边使得岛屿不连通,那么去掉的这 ...

  3. HDU 4738 Caocao's Bridges(Tarjan求桥+重边判断)

    Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. HDU 4738——Caocao's Bridges——————【求割边/桥的最小权值】

     Caocao's Bridges Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  5. HDU 4738 Caocao's Bridges (2013杭州网络赛1001题,连通图,求桥)

    Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. HDU——4738 Caocao's Bridges

    Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. HDU 4738 Caocao's Bridges

    Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  8. hdu 4738 Caocao's Bridges (tarjan求桥)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意:给一些点,用一些边把这些点相连,每一条边上有一个权值.现在要你破坏任意一个边(要付出相 ...

  9. 2013杭州网赛 1001 hdu 4738 Caocao's Bridges(双连通分量割边/桥)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题意:有n座岛和m条桥,每条桥上有w个兵守着,现在要派不少于守桥的士兵数的人去炸桥,只能炸一条桥 ...

随机推荐

  1. 2015年百度之星初赛(1) --- F 矩形面积

    矩形面积 Problem Description 小度熊有一个桌面,小度熊剪了很多矩形放在桌面上,小度熊想知道能把这些矩形包围起来的面积最小的矩形的面积是多少.   Input 第一行一个正整数 T, ...

  2. P6 EPPM 16 R1 文档和帮助系统

    P6 EPPM 16 R1 文档和帮助系统 https://docs.oracle.com/cd/E74894_01/ http://docs.oracle.com/cd/E68202_01/clie ...

  3. [转]easyui datagrid 批量编辑和提交

    web前台主要代码: <script type="text/javascript"> $(function() { var $dg = $("#dg" ...

  4. 利用name或id属性设置页面跳转的锚点

    理论准备         网页中的链接按照链接路径的不同,可以分为3种类型,分别是内部类型.锚点链接和外部链接:         按照使用对象的不同,网页中的链接又分为文本超链接,图像超链接,E-ma ...

  5. [CLR via C#]26. 计算限制的异步操作

    一.CLR线程池基础 前面说过,创建和销毁线程是一个比较昂贵的操作,太多的线程也会浪费内存资源.由于操作系统必须调度可运行的线程并执行上下文切换,所以太多的线程还有损于性能.为了改善这个情况,CLR使 ...

  6. 【循序渐进学Python】8.面向对象的核心——类型(下)

    1 构造和初始化对象 __init__方法是Python内建众多魔法方法(什么是魔法方法?)中最常见的一个,通过这个方法我们可以定义一个对象的初始操作.当构造函数被调用的时候的任何参数都会传递给__i ...

  7. 【学习整理】NOIP涉及的数论 [updating]

    扩展欧几里得 求二元一次不定式方程 的一组解. int exgcd(int a,int b,int &x,int &y) { int t; ;y=;return a;} t=exgcd ...

  8. Java内存泄露的原因

    Java内存泄露的原因 1.静态集合类像HashMap.Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,所有的对象Object也不能被释放,因为他们也将一直被Vector ...

  9. 我所了解的WEB开发(2) - PS切片

    PS对于WEB设计和前端开发来说都是不可或缺的工具,基本的用途是用来处理网站的LOGO.Banner 以及按钮图标来着,但是一旦遇上要把整个PSD文件转成网页就让人非常头痛了,可能还不太专业.后来在公 ...

  10. DigitalOcean上SSH Key的创建(附DigitalOcean邀请)

    DigitalOcean是一家云主机商家,最低配置512M内存,20G的SSD,每月只有5刀.半个月前刚刚在这上面买了一个VPS,创建Droplet的时候看见创建SSH Key的时候就有点懵,不知道这 ...