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

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. Javascript 学习笔记 无缝滚动

    效果 : 鼠标移入图片 停止滚动, 鼠标移出自动滚动 可以调整向左或右方向滚动 <style type="text/css"> * { margin:; padding ...

  2. mud目录命令说明

      目錄結構 以下列出的是 ES2 mudlib 根目錄下標準的子目錄結構,以及簡短的說明. /adm 儲存由系統管理者所管理的程式與資料檔. /std 儲存標準物件的程式碼. /obj 儲存通用物件 ...

  3. Werkzeug源码阅读笔记(三)

    这次主要讲下werkzeug中的Local. 源码在werkzeug/local.py Thread Local 在Python中,状态是保存在对象中.Thread Local是一种特殊的对象,它是对 ...

  4. 程序员眼里IE浏览器是什么样的

    主流浏览器之争从上个世纪开就开始,已经持续了很长的时间.就在几年前,IE还是最主流的web浏览器.但现在形势完全不同了,人们都在笑话IE,纷纷转向其它浏览器.今天,我向大家分享一下针对IE的搞笑图片, ...

  5. Android SQLiteDatabase使用总结

    SQLiteDatabase数据库操作 1.创建一个继承了类SQLiteOPenHelper类复写相应的方法,和构造函数 2.然后创建一个类,定义一个私有变量(上述类的实例化对象),在构造函数中进行初 ...

  6. Unix/Linux环境C编程入门教程(6) 安装Fedora C/C++开发环境

    安装Fedora  C/C++开发环境 1 Fedora 是一个开放的.创新的.前瞻性的操作系统和平台,基于 Linux. 2.选择自定义配置 3.设置版本为10.0 4.选择稍后安装 5.选择64位 ...

  7. _sortBy用法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. SPOJ GSS1 && GSS3 (无更新/更新单点,并询问区间最大连续和)

    http://www.spoj.com/problems/GSS1/ 题意:无更新询问区间最大连续和. 做法:线段树每个节点维护sum[rt],maxsum[rt],lsum[rt],rsum[rt] ...

  9. Ubuntu下屏幕录像、后期处理不完全攻略

    提要 如果要做成果展示或者效果演示,通常需要录取屏幕生成视频文件,在windows中我们可以用屏幕录像专家在录像, vegas 来做后期处理,Ubuntu可以么? 答案时当然可以!虽然第一次用觉得有点 ...

  10. Android SQLite 事务处理

    应用程序初始化时需要批量的向sqlite中插入大量数据,单独的使用for+Insert方法导致应用响应缓慢,因为 sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作.我 ...