题意:给你一个无向图,给你一个炸弹去炸掉一条边,使得整个图不再联通,你需要派人去安置炸弹,且派去的人至少要比这条边上的人多。问至少要派去多少个,如果没法完成,就输出-1。

  分析:如果这个图是已经是多个联通块了,那么一个人都不用去,如果不是,那么只要找出这个无向图上的桥并且哨兵数量最少的那座把它炸了就行(输出这条边上的哨兵数量即可)。直接tarjan就可以写。

  注意点:1.可能有重边,所以用手写邻接表的方式存图;2.如果一座桥上没有哨兵,那么你也得至少派去一个人去安置炸弹(因为炸弹不会自己飞过去啊233...)。

  代码如下:

 #include <stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
#include <stack>
#include <vector>
using namespace std;
typedef long long ll;
const int N = + ; int n,m,head[N],tot,scc_cnt,dfn[N],low[N],dfs_clock,cnt;
bool vis[N*N],use[N];
//stack<int> S;
struct edge
{
int v,nxt,w;
}edges[N*N];
struct bridge
{
int u,v,w;
bool operator < (const bridge &temp) const
{
return w<temp.w;
}
};
vector<bridge> bridges;
void addEdge(int u,int v,int w)
{
edges[tot] = (edge){v,head[u],w};
head[u] = tot++;
edges[tot] = (edge){u,head[v],w};
head[v] = tot++;
} void init()
{
memset(head,-,sizeof(head));
tot = ;
//scc_cnt = 0;
dfs_clock = ;
memset(dfn,,sizeof(dfn));
bridges.clear();
memset(vis,false,sizeof(vis));
cnt = ;
memset(use,false,sizeof(use));
} void tarjan(int u)
{
dfn[u] = low[u] = ++dfs_clock;
//S.push(u);
for(int i=head[u];i!=-;i=edges[i].nxt)
{
if(vis[i]) continue;
// 因为可能存在有重边,所以这里必须这么写
vis[i] = vis[i^] = true;
int v = edges[i].v;
if(!dfn[v])
{
tarjan(v);
low[u] = min(low[u],low[v]);
if(low[v] > dfn[u]) bridges.push_back((bridge){u,v,edges[i].w});
}
else if(dfn[v] < dfn[u])
{
low[u] = min(low[u],dfn[v]);
}
}
/*if(dfn[u]==low[u])
{
scc_cnt++;
for(;;)
{
int x = S.top();S.pop();
if(x == u) break;
}
}*/
} void dfs(int u)
{
use[u] = true;
for(int i=head[u];i!=-;i=edges[i].nxt)
{
int v = edges[i].v;
if(use[v]) continue;
dfs(v);
}
} void solve()
{
for(int i=;i<=n;i++) if(!dfn[i]) tarjan(i);
for(int i=;i<=n;i++)
{
if(!use[i])
{
cnt++;
dfs(i);
}
} if(cnt==)
{
if(bridges.size()==) puts("-1");
else
{
sort(bridges.begin(),bridges.end());
printf("%d\n",bridges[].w==?:bridges[].w);
// 如果这座桥上没有人,周瑜也必须派一个人去放置炸弹
}
}
else puts("");
} int main()
{
while(scanf("%d%d",&n,&m)==)
{
if(n== && m==) break;
init();
for(int i=;i<=m;i++)
{
int u,v,w;scanf("%d%d%d",&u,&v,&w);
addEdge(u,v,w);
}
solve();
}
}

HDU 4738 Caocao's Bridges ——(找桥,求联通块)的更多相关文章

  1. HDU 4738 Caocao's Bridges(Tarjan求桥+重边判断)

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

  2. hdu 4738 Caocao's Bridges 图--桥的判断模板

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

  3. hdu 4738 Caocao's Bridges(桥的最小权值+去重)

    http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意:曹操有一些岛屿被桥连接,每座都有士兵把守,周瑜想把这些岛屿分成两部分,但他只能炸毁一条桥,问最少 ...

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

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

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

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

  6. HDU 4738——Caocao's Bridges——————【求割边/桥的最小权值】

     Caocao's Bridges Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

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

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

  8. hdu 4738 Caocao's Bridges 求无向图的桥【Tarjan】

    <题目链接> 题目大意: 曹操在长江上建立了一些点,点之间有一些边连着.如果这些点构成的无向图变成了连通图,那么曹操就无敌了.周瑜为了防止曹操变得无敌,就打算去摧毁连接曹操的点的桥.但是诸 ...

  9. HDU——4738 Caocao's Bridges

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

随机推荐

  1. java 字节流与字符流的区别(转)

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操 ...

  2. WIN7(WINDOWS7)在添加网络打印机时提示这个,这里的密码是什么密码,能不能不用密码?

    360急救箱应该提高计算机的网络访问安全性,加上与验证机制,所以当你要访问的网络资源,你需要输入用户名和密码进行认证. 1,点击“开始 - 运行”,输入gpedit.msc然后按Enter键. 2,计 ...

  3. c# winform 窗体间的传值

    1.父窗体传值给子窗体: 1) 父窗体: FrmXX frm = ,); frm.Owner = this; frm.ShowDialog(); 子窗体: ; public FrmXX(int ty, ...

  4. 手把手教你搭建FastDFS集群(下)

    手把手教你搭建FastDFS集群(下) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/u0 ...

  5. 高并发之nginx限制

    Nginx限速模块分为哪几种?按请求速率限速的burst和nodelay参数是什么意思?漏桶算法和令牌桶算法究竟有什么不同?本文将带你一探究竟. 我们会通过一些简单的示例展示Nginx限速限流模块是如 ...

  6. Vue访问权限

    设置权限 <script> export default { created(){ if(this.$store.state.userStore.role !== 'manager'){ ...

  7. php 随笔 截取字符串 跳出循环 去除空格 修改上传文件大小限制

    substr(string,start,length) echo substr("Hello world",6); world 跳出循环 for($i=1; $i<5; $i ...

  8. MacBook Pro实现共享屏幕(多台mac之间)

    1 开启允许所有用户控制屏幕     设置— 共享           2 在另一台MacBook Pro里打开finder窗口,并设置好network显示边栏  3  另一台机器发送请求控制   找 ...

  9. (十)全志R18 Tina平台关闭所有串口打印的方法

    全志R18 Tina平台关闭所有打印输出方法: 有些国外的产品安全认证,如亚马逊Alexa认证,认证机构会不停地点pcb上的点,看有没有东西输出,有的话就通过这些口想办法破解设备,所以安全认证会要求设 ...

  10. datePicker 及 timePicker Diolage弹出对话框式 比较好看的 监听事件

    DatePickerDialog 的监听 new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { @Override ...