HDU4738【杭州网赛、判桥】
刚拿到这道题时挺有思路,无奈平日里只敲过找割顶的代码,判桥的代码当时自己也没仔细敲。
当时一把泪啊,忽然感觉自己的图论才只是刚搞了个起步啊
。。
题目有神坑。 就是先判是否连通,不连通直接输出0;
还有一个比较坑的是有重边的情况,那这样就有重边的两点之间就不可能存在桥。
再就是桥上无士兵把守也要派一个人去炸。
。。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std; const int maxn = 1500;
int dfs_clock, current_clock, ans, current_cc;
int adj[maxn][maxn], iscut[maxn], vis[maxn], pre[maxn], low[maxn];
vector<int> G[maxn];
int n, m, a, b, c, INF = 10000000; void dfs(int u)
{
vis[u] = 1;
//PREVISIT(u); 访问u之前的操作
for(int i = 0; i < G[u].size(); i++)
{
int v = G[u][i];
if(!vis[v]) dfs(v);
}
//POSTVISIT(u); 访问结点u之后的操作
} void find_cc() //给连通分量标号
{
current_cc = 0;
memset(vis, 0, sizeof(vis));
for(int u = 1; u <= n; u++) if(!vis[u])
{
current_cc++;
dfs(u);
}
} int dfs_bridge(int u,int fa) //u在dfs树中的父结点是fa
{
int lowu = pre[u] = ++dfs_clock;
int child = 0; //子结点数目
for(int i = 0; i < G[u].size(); i++)
{
int v = G[u][i];
if(!pre[v]) //没有访问过v
{
child++;
int lowv = dfs_bridge(v, u);
lowu = min(lowu, lowv);
if(lowv >= pre[u])
{
iscut[u] = true; //割点判断
if(lowv > pre[u] && adj[u][v] != -2) //桥的判断可以相应灵活处理
ans = min(ans, adj[u][v]);
}
}
else if(pre[v] < pre[u] && v != fa)
lowu = min(lowu, pre[v]); //用反向边更新u的low函数
}
if(fa < 0 && child == 1)
{
// 但是不用加是否单独判桥的判断?
iscut[u] = 0; //应该是避免单结点判桥、割顶的情况吧
}
low[u] = lowu;
return lowu;
} void init()
{
memset(pre, 0, sizeof(pre));
memset(iscut, 0, sizeof(iscut));
memset(adj, -1 ,sizeof(adj));
for(int i = 0; i <= n; i++)
G[i].clear();
} int main()
{
while(scanf("%d%d",&n, &m) != EOF)
{
if(!n && !m) break;
init();
while(m--)
{
scanf("%d%d%d", &a, &b, &c);
if(adj[a][b] == -1)
{
G[a].push_back(b);
G[b].push_back(a);
adj[a][b] = c;
adj[b][a] = c;
}
else // 两点之间有两条边肯定不可能是桥
{
adj[a][b] = -2;
adj[b][a] = -2;
}
} ans = INF;
dfs(1); find_cc();
//printf("~%d\n",current_cc);
if(current_cc >= 2) { printf("0\n"); continue;}
else dfs_bridge(1, -1);
if(ans == 0) printf("1\n");
else if(ans == INF ) printf("-1\n");
else printf("%d\n", ans);
}
return 0;
}
HDU4738【杭州网赛、判桥】的更多相关文章
- 2013杭州网赛 1001 hdu 4738 Caocao's Bridges(双连通分量割边/桥)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题意:有n座岛和m条桥,每条桥上有w个兵守着,现在要派不少于守桥的士兵数的人去炸桥,只能炸一条桥 ...
- 杭州网赛 two rabbits (hdu 4745)
算法很简单,问题是,怎么证明,答案是回文序列. 设a,b走的序列按顺时针是: a1 , a2 , a3 , ... , ak b1 , b2 , b3 , ... , bk 考虑端点的2种情况: 1. ...
- hdu4740【杭州网赛、模拟、有点搜索?】
当时看了这题就感觉so easy... 本来不想写的,后来感觉是不是可以练一下搜索水平.. 比赛时有人过了就没写. 比赛完了写一下. 实现还不是那么顺利, 囧 本来自己以为这题能练下搜 ...
- ZOJ Bizarre Routine 2013杭州网赛B题
题目意思: 给定n, expect, a, b 要求你构造一组array[],存放一个1..n的排列,使的下面的程序能输出YES 题目所示代码: bool less_than(x, y) { T++; ...
- HDU 4746 HDOJ Mophues 2013杭州网赛I题
比赛的时候就预感到这题能出,但是会耗时比较多.结果最后是出了,但是有更简单的题没出. 是不是错误的决策呢?谁知道呢 题目意思: 定义f(x) = x分解质因数出来的因子个数 如 x = p0 * p0 ...
- 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杭州现场赛B题-Rabbit Kingdom
杭州现场赛的题.BFS+DFS #include <iostream> #include<cstdio> #include<cstring> #define inf ...
- HDU 4745 Two Rabbits (2013杭州网络赛1008,最长回文子串)
Two Rabbits Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Tota ...
- HDU 4747 Mex (2013杭州网络赛1010题,线段树)
Mex Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
随机推荐
- Android Studio导入GitHub
方法一:引用开源项目的compile添加到gradle中http://www.zhihu.com/question/27027667 方法二:下载安装包引入:http://blog.csdn.net/ ...
- CodeForces 214B Hometask
本题求n个数组成的大数,要求是2,3,5的倍数. 因为是2 和5 的倍数,所以个位为 0:所以若n个数中没有0,直接输出-1: 难点就是要求为3 的倍数. 因为若某个数为3的倍数,则其各位数的和必然是 ...
- sql server数据库实现保留指定位数小数的函数
有时候需要对一个特定的含有小数点的数字保留指定位数,比如"123.123600". 在数据库中以函数的形式实现如下: USE [数据库名称] GO /****** Object: ...
- VC++学习之一
对于编程语言,我一直认为它只是一种工具,就像锤子,斧头一样,每种语言都用自己比较适用的地方,用的时候拿来就可以了.这种思想让我对语言没有做过很仔细的学习,虽然频繁使用过C,C++,java,C#,De ...
- Linux下chkconfig命令详解(转)
Linux下chkconfig命令详解 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. ...
- hdu 4497 GCD and LCM 质因素分解+排列组合or容斥原理
//昨天把一个i写成1了 然后挂了一下午 首先进行质因数分解g=a1^b1+a2^b2...... l=a1^b1'+a2^b2'.......,然后判断两种不可行情况:1,g的分解式中有l的分解式中 ...
- hdu 5500 Reorder the Books(规律)
题意: 有一个1→n的排列形成的数列,我们要用最少的操作次数把这个数列从小到大排序,每次操作都是把一个数放到整个数列的最前面. 思路: 首先最大的数n是不用操作的(其他数操作好了,n ...
- JS属性
1.类型分析: js中的数据类型有undefined,boolean,number,string,object等5种,前4种为原始类型,第5种为引用类型. 代码: var a1;var a2 = tr ...
- PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码
PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码 看看新闻网>看引擎>开源产品 0人收藏此文章, 发表于8小时前(2013-09-06 00:39) ...
- Trie树-脏词过滤应用
Trie树,又称字符查找树.前缀树,主要用于字符匹配(详见http://en.wikipedia.org/wiki/Trie).适合做关键词查找,比如查找文章中的关键字然后给他们加链接. 当然对脏词的 ...