题目链接: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求桥)的更多相关文章

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

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

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

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

  3. HDU 4738 Caocao's Bridges ——(找桥,求联通块)

    题意:给你一个无向图,给你一个炸弹去炸掉一条边,使得整个图不再联通,你需要派人去安置炸弹,且派去的人至少要比这条边上的人多.问至少要派去多少个,如果没法完成,就输出-1. 分析:如果这个图是已经是多个 ...

  4. HDU 4738 Caocao's Bridges(Tarjan)

    题目链接 #include <iostream> #include <cstring> #include <cstdio> #include <queue&g ...

  5. kuangbin专题 专题九 连通图 HDU 4738 Caocao's Bridges

    题目链接:https://vjudge.net/problem/HDU-4738 题目:tarjan求桥,坑点: 题目说是分岛任务...如果所有岛之间没有完全连通,就不需要执行任务了...答案直接是0 ...

  6. hdu 4738 Caocao's Bridges(割边)

    题目链接 用tarjan求桥上的最小权值 #include<bits/stdc++.h> #define ll long long int using namespace std; inl ...

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

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

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

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

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

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

随机推荐

  1. 查看oracle 启动了多久

    想看一下系统正常运行了多少天?开机多长时间没有重启了? windows系统 C:\>systeminfo |find “系统启动时间”系统启动时间:     265 天 4 小时 26 分 32 ...

  2. NSdate 时间格式

    NSdate 时间格式 NSTimeInterval 时间间隔 基本单位 秒 NSDateFormatter 时间格式器 用于日期对象的格式化或字符串解析为日期对象 日期格式如下: y  年 M  年 ...

  3. LInkedList集合练习

    package com.java.linkedlist; import java.util.LinkedList; /* * LinkedList类的特点:查询速度慢,增删速度快. * LinkedL ...

  4. SVM推导

    标准最大margin问题 假设data是linear seperable的 优化目标 希望 margin(w),i.e, 最小的点到直线的距离 最大 即是要得到最右的线,它对噪声的鲁棒性最好 得到的分 ...

  5. MFC中cannot find the definition (implementation) of this function 解决方法

    问题:使用vc6 在点击左侧class view中的一个方法实现时出现下面错误:    cannot find the definition (implementation) of this func ...

  6. Debian6安装XP系统

    1.下载一键包,必须要在 root目录 下执行,可以先用 pwd 命令查看当前所在目录.执行命令:wget http://d.yxlgh.com/vps/zmdebian6xp.sh 2.执行 zmd ...

  7. php session 自定义的设置测试

    <?php // ini_set('session.save_handler', 'user'); // 注意 set_session_save_handler() 一定要在 session_s ...

  8. javascript div跟随鼠标移动

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  9. 11-17的学习总结(DOMfirstday)

    HTML: 超文本标记语言,专门定义网页内容的语言 XHTML: 严格的HTML标准 DHTML: 所有实现网页动态效果技术的统称 XML: 可扩展的标记语言,标签都是自定义的 XML语法和HTML语 ...

  10. java执行机制

    java代码编译是由Java源码编译器来完成,流程图如下所示: Java字节码的执行是由JVM执行引擎来完成,流程图如下所示: Java代码编译和执行的整个过程包含了以下三个重要的机制: Java源码 ...