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

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. [原创]linux简单之美(三)

    原文链接:linux简单之美(三) 在linux简单之美(二)中我们尝试使用了C库的函数完成功能,那么能不能用syscall方式来搞呢?显然可以! section .data ft db sectio ...

  2. Sencha Touch 之 Ext.ComponentManager.get方法使用

    HTML代码: <!doctype html> <html> <head> <meta charset="utf-8"> <t ...

  3. c++中vector与list的区别

    c++标准库中,容器vector和list都可以用来存放一组类型相同的数据.而且二者不同于数组的一点是,支持动态增长.但它们还是有有几点不同 (1)  vector是顺序表,表示的是一块连续的内存,元 ...

  4. Orchard 源码探索(Log)

    简单工厂模式.抽象工厂模式和适配器模式 依赖倒置原则也叫依赖倒转原则,Dependence Inversion Principle,对抽象进行编程,不要对实现进行编程. A.高层次的模块不应该依赖于低 ...

  5. hibernate详解

    Hibernate原理与应用 主要内容 1.引入 2.安装配置 3.基本概念和CURD 4.HQL和Criteria 5.关联映射 6.继承映射 7.集合映射 8.懒加载 9.缓存 10.事务 11. ...

  6. Oracle_用户管理

    创建用户: CREATE USER user   --创建用户user IDENTIFIED {BY password | EXTERNALLY}  --设备用户密码,EXTERNALLY说用该用户由 ...

  7. QT 声明全局变量

    声明 qdatabasemanager.h #include"qdatabasemanager.h" externQDatabaseManager*Database; 引用 mai ...

  8. VS2012 TFS切换账号登录

    最近要做团队项目,用到的vs2012的tfs代码管理器(win7 +vs2012),切换账号的流程如下: 1.打开控制面板,进入用户账户 2.点击左侧的管理您的凭据,看到自己的TFS服务器的地址,然后 ...

  9. jQuery Mobile基础

    1.安装 在<head></head>标签里边写入以下内容 jQuery Mobile CDN: <head> <meta charset="utf ...

  10. Deep Learning(深度学习)学习笔记整理系列之(六)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...