就是求最小权值的桥。。不过有好几个坑。。。

1:原图不连通,ans=0.

2: m<=n^2 显然有重边,重边必然不是桥,处理重边直接add(u, v, INF).

3:   最小桥边权为0的时候,ans=1,至少要派一个人运炸弹。。。

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
#include<stack>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<fstream>
#include<sstream>
#include<map>
#include<set>
using namespace std; const int N = 1111;
const int INF = 100000000;
int n, m;
int pre[N], low[N], dfs_clock;
int bccno[N], vis[N], wi[N][N], g[N][N];
struct Edge
{
//flag = 1 ->bridge
int from, to, w, flag;
};
vector<int> G[N];
vector<Edge> edges; //add bidir edge
void addedge(int u, int v, int w)
{
edges.push_back((Edge){u, v, w, 0});
edges.push_back((Edge){v, u, w, 0});
int nima = edges.size();
G[u].push_back(nima-2);
G[v].push_back(nima-1);
} int dfs(int u, int fa)
{
int lowu = pre[u] = ++dfs_clock;
int sz = G[u].size();
for(int i=0; i<sz; i++)
{
int v = edges[G[u][i]].to;
if(!pre[v])
{
int lowv = dfs(v, u);
lowu = min(lowu, lowv);
if(lowv > pre[u]) edges[G[u][i]].flag = 1, edges[G[u][i]^1].flag = 1;
}
else if(pre[v] < pre[u] && v != fa) lowu = min(lowu, pre[v]);
}
return low[u] = lowu;
} void dfs1(int u)
{
vis[u] = 1;
int sz = G[u].size();
for(int i=0; i<sz; i++)
{
Edge e = edges[G[u][i]];
int v = e.to;
if(!vis[v]) dfs1(v);
}
}
int u, v, w; int main()
{
while(scanf("%d%d", &n, &m), n+m)
{
for(int i=0; i<n+1; i++) G[i].clear();
edges.clear();
memset(g, 0, sizeof(g));
for(int i=0; i<m; i++)
{
scanf("%d%d%d", &u, &v, &w); u--; v--;
g[u][v]++; //BIANSHU
g[v][u]++;
wi[u][v] = w;
} //CHONG BIAN
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
{
if(g[i][j] == 1) addedge(i, j, wi[i][j]);
else if(g[i][j] > 1) addedge(i, j, INF);
} //BU LIANTONG
memset(vis, 0, sizeof(vis));
dfs1(0);
bool flag = 0;
for(int i=0; i<n; i++)
{
if(!vis[i])
{
flag = 1;
break;
}
}
if(flag)
{
puts("0");
continue;
}
//QIAO
memset(pre, 0, sizeof(pre));
dfs_clock = 0;
for(int i=0; i<n; i++) if(!pre[i]) dfs(i, -1);
int ans = INF;
int sz = edges.size();
for(int i=0; i<sz; i++) if(edges[i].flag == 1) ans = min(ans, edges[i].w);
if(ans == INF) puts("-1");
else printf("%d\n", ans == 0 ? 1 : ans); //0 -> 1
}
return 0;
}

hdu 4738 Caocao's Bridges(2013杭州网络赛丶神坑)的更多相关文章

  1. HDU 4745 Two Rabbits (2013杭州网络赛1008,最长回文子串)

    Two Rabbits Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  2. HDU 4738 Caocao's Bridges taijan (求割边,神坑)

    神坑题.这题的坑点有1.判断连通,2.有重边,3.至少要有一个人背*** 因为有重边,tarjan的时候不能用子结点和父节点来判断是不是树边的二次访问,所以我的采用用前向星存边编号的奇偶性关系,用^1 ...

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

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

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

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

  5. HDU 4747 Mex (2013杭州网络赛1010题,线段树)

    Mex Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  6. HDU 4741 Save Labman No.004 (2013杭州网络赛1004题,求三维空间异面直线的距离及最近点)

    Save Labman No.004 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  7. HDU 4739 Zhuge Liang's Mines (2013杭州网络赛1002题)

    Zhuge Liang's Mines Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  8. HDU 4763 Theme Section (2013长春网络赛1005,KMP)

    Theme Section Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  9. HDU 4759 Poker Shuffle(2013长春网络赛1001题)

    Poker Shuffle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

随机推荐

  1. Moutain Tai notes

    rest 40shaxian 18 drumsticks  13零食 11.5+21车费5门票62大衣10面14 > 194.5 notes :::: 岗位职责:1.基于Drupal系统的产品功 ...

  2. 查询Oracle正在执行的sql语句

    --查询Oracle正在执行的sql语句及执行该语句的用户 SELECT b.sid oracleID, b.username 登录Oracle用户名, b.serial#, spid 操作系统ID, ...

  3. CDC变更数据捕获

    CDC变更数据捕获 (2013-03-20 15:25:52)   分类: SQL SQL Server中记录数据变更的四个方法:触发器.Output子句.变更数据捕获(Change Data Cap ...

  4. linux 环境操作faq 记录

    1. ubuntu adb 提示???? 找不到设备 这个问题不是一次两次了记录下,以后好找点. 问题:ubuntu下adb 不是别设备 http://blog.csdn.net/chychc/art ...

  5. HTTP协议漫谈

    简介 园子里已经有不少介绍HTTP的的好文章.对HTTP的一些细节介绍的比较好,所以本篇文章不会对HTTP的细节进行深究,而是从够高和更结构化的角度将HTTP协议的元素进行分类讲解. HTTP的定义和 ...

  6. [Leetcode][Python]31: Next Permutation

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 31: Next Permutationhttps://oj.leetcode ...

  7. 前端开发工具—fiddle

  8. deque双向队列(转)

    deque双向队列是一种双向开口的连续线性空间,可以高效的在头尾两端插入和删除元素,deque在接口上和vector非常相似,下面列出deque的常用成员函数:   deque的实现比较复杂,内部会维 ...

  9. 基于eclipse的mybatis映射代码自动生成的插件http://blog.csdn.net/fu9958/article/details/7521681

    基于eclipse的mybatis映射代码自动生成的插件 分类: JAVA 数据库 工具相关2012-04-29 00:15 2157人阅读 评论(9) 收藏 举报 eclipsegeneratori ...

  10. Javascript 获取窗口的大小和位置

    在Javascript中可以使用OuterWidth,OuterHeight 获取浏览器的大小.用 innerWidth,innerHeight 来获取窗口的大小(除去浏览器边框部分).对于IE6 及 ...