HDU 4738 Caocao's Bridges(Tarjan求桥+重边判断)
Caocao's Bridges
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3992 Accepted Submission(s): 1250
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.
题目链接:HDU 4738
题目不难但有三个坑点:1、两点之间可能有重边;2、初始状态的图已经不是连通的了;3、某个桥就算没人守也至少派要一个人去炸桥
这题的重边可以有两种处理方式,很容易想到简单方法就是多用一个邻接矩阵来记录两点之间守卫人数,在加边的时候就把重边判断掉使其权值变成INF,这样就算有桥也是拿INF这个权值去更新答案
第二种就是给每一条边一个id,然后判断是否往回走就不是用v==pre而是id==E[i].id,这样一来若有重边则肯定存在另外至少一个不同id的边可以进行dfs把pre(指向u的后向边)的low更新掉,导致low[v]不会大于dfn[u],就构不成桥的条件了,解决了重边的问题。
例如这样的数据
2 2
1 2 2
1 2 2
首先是dfs从1->2,把1的dfn更新,发现2没访问过,开始从2递归即2->1,遍历发现2->1这条边和1->2这走过来的边id一样,continue,又发现一条2->1的但id不一样的,但是此时的dfn[1]已经有值且1在stack中,则$low[2]=min(low[2],dfn[1])=1$,此时$low[2]$便不会大于$dfn[1]$
感觉第二种方法比较好用且适用性好,学习一个
代码:
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define CLR(x,y) memset(x,y,sizeof(x))
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
typedef pair<int,int> pii;
typedef long long LL;
const double PI=acos(-1.0);
const int N=1007;
struct edge
{
int to;
int pre;
int id;
int w;
};
edge E[N*N];
int head[N],tot;
//int soldier[N][N];//第一种方法所需的的邻接矩阵
int low[N],dfn[N],ts,top,st[N],ins[N];
int least; void init()
{
CLR(head,-1);
tot=0;
//CLR(soldier,INF);
CLR(low,0);
CLR(dfn,0);
ts=top=0;
CLR(ins,0);
least=INF;
}
inline void add(int s,int t,int w,int id)
{
E[tot].to=t;
E[tot].id=id;
E[tot].w=w;
E[tot].pre=head[s];
head[s]=tot++;
}
void Tarjan(int u,int id)
{
low[u]=dfn[u]=++ts;
ins[u]=1;
st[top++]=u;
int v;
for (int i=head[u]; ~i; i=E[i].pre)
{
v=E[i].to;
if(id==E[i].id)
continue;
if(!dfn[v])
{
Tarjan(v,E[i].id);
low[u]=min<int>(low[v],low[u]);
if(low[v]>dfn[u])
{
int need=E[i].w;
if(need<least)
least=need;
}
}
else if(ins[v])
low[u]=min<int>(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
do
{
v=st[--top];
ins[v]=0;
}while (u!=v);
}
}
int main(void)
{
int n,m,a,b,w,i;
while (~scanf("%d%d",&n,&m)&&(n||m))
{
init();
for (i=0; i<m; ++i)
{
scanf("%d%d%d",&a,&b,&w);
add(a,b,w,i);
add(b,a,w,i);
}
int k=0;
for (i=1; i<=n; ++i)
{
if(!dfn[i])
{
Tarjan(i,-1);
++k;
}
}
if(k>1)//连通图数量
least=0;
else if(least==0)//至少派一个人去
least=1;
else if(least==INF)//
least=-1;
printf("%d\n",least);
}
return 0;
}
HDU 4738 Caocao's Bridges(Tarjan求桥+重边判断)的更多相关文章
- hdu 4738 Caocao's Bridges (tarjan求桥)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意:给一些点,用一些边把这些点相连,每一条边上有一个权值.现在要你破坏任意一个边(要付出相 ...
- 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 (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个兵守着,现在要派不少于守桥的士兵数的人去炸桥,只能炸一条桥 ...
随机推荐
- codeforces A. Domino 解题报告
题目链接:http://codeforces.com/problemset/problem/353/A 题目意思:通俗地说,就是当上下两半的数的总和不完全是偶数时,通过上下调换某些骨牌来使这两半的数和 ...
- 使用apktool工具遇到could not decode arsc file的解决办法
问题详情: 当前环境为 win7 64位 jdk1.7 apktool.jar(版本1.5.2) apktool(版本windows-r05-ibot) 使用的反编译工具和apk文件为 反编译 ...
- Windows下安装Cygwin及包管理器apt-cyg(转)
本文为转载文章: http://www.2cto.com/os/201212/176551.html Cygwin可以在Windows下使用unix环境Bash和各种功能强大的工具,对于Linux管理 ...
- 水果姐逛水果街Ⅰ(codevs 3304)
题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了 ...
- Quartus signal tapii 的使用
此功能原来已经试验过,没有笔记.这次复习巩固下. 使用PLL 的程序. 1.新建signaltap ii 文件 注意以下几个地方,会用到 添加采样时钟 . 添加采样信号: 完成之后,编译下载 运行 两 ...
- 深入学习SQL的Limit语句
一.基本语法 SQL的limit语法的如以下形式 SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset 当省略offset的时候 ...
- Oracle 11g 卸载
1.关闭oracle所有的服务.可以在windows的服务管理器中关闭: 2.打开注册表:regedit 打开路径: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlS ...
- JS实现自动倒计时
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- node连接--MongoDB
简介: 传统关系类型(ORM:Object-Relational Mapper),MongoDB(ODM:Object Document Mapper); MongoDB是一个面向文档,schme无关 ...
- Xamarin Android提示找不到资源属性定义
Xamarin Android提示找不到资源属性定义 错误信息:”Resource.Attribute”未包含”actonBarSize”的定义Xamarin Android经常会出现找不到资源属性的 ...