【UVA10765】Doves and bombs (BCC求割点后联通块数量)
题目:

题意:
给了一个联通无向图,现在问去掉某个点,会让图变成几个联通块?
输出的按分出的从多到小,若相等,输出标号从小到大。输出M个。
分析:
BCC求割点后联通块数量,Tarjan算法。
联通块的数目在找到一个low[y]>=dfn[x]时累加,最后加一即可。
代码如下:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 10010 int n,m;
int first[Maxn],low[Maxn],dfn[Maxn],fa[Maxn],son[Maxn];
int cut[Maxn];
int cnt; struct node
{
int x,y,next;
};
node t[Maxn*],ans[Maxn];
int len; int mymin(int x,int y) {return x<y?x:y;} void ins(int x,int y)
{
t[++len].x=x;t[len].y=y;
t[len].next=first[x];first[x]=len;
} bool cmp(node x,node y) {return (x.x==y.x)?(x.y<y.y):(x.x>y.x);} void ffind(int x,int f)
{
dfn[x]=low[x]=++cnt;
fa[x]=f;
for(int i=first[x];i;i=t[i].next) if(t[i].y!=f)
{
int y=t[i].y;
if(dfn[y]==)
{
ffind(y,x);
son[x]++;
low[x]=mymin(low[x],low[y]);
if(low[y]>=dfn[x]) cut[x]++;
}
else low[x]=mymin(low[x],dfn[y]);
}
} int main()
{
while()
{
scanf("%d%d",&n,&m);
if(n==&&m==) break;
len=;cnt=;
memset(first,,sizeof(first));
while()
{
int a,b;
scanf("%d%d",&a,&b);
if(a==-&&b==-) break;
a++;b++;
ins(a,b);ins(b,a);
}
memset(dfn,,sizeof(dfn));
memset(cut,,sizeof(cut));
memset(son,,sizeof(son));
ffind(,);ans[].y=;
if(son[]>) ans[].x=son[];
else ans[].x=;
for(int i=;i<=n;i++)
{
ans[i].y=i-;
ans[i].x=cut[i]+;
}
sort(ans+,ans++n,cmp);
for(int i=;i<=m;i++) printf("%d %d\n",ans[i].y,ans[i].x);
printf("\n");
}
return ;
}
[UVA10765]
2016-03-17 13:43:40
【UVA10765】Doves and bombs (BCC求割点后联通块数量)的更多相关文章
- poj 1523 SPF 求割点以及删除该割点后联通块的数量
SPF Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7136 Accepted: 3255 Description C ...
- hdu 4587 2013南京邀请赛B题/ / 求割点后连通分量数变形。
题意:求一个无向图的,去掉两个不同的点后最多有几个连通分量. 思路:枚举每个点,假设去掉该点,然后对图求割点后连通分量数,更新最大的即可.算法相对简单,但是注意几个细节: 1:原图可能不连通. 2:有 ...
- POJ-3107 Godfather 求每个节点连接的联通块数量
dp[n][2],维护儿子的联通块数量和父亲的联通块数量. 第一遍dfs求儿子,第二遍dfs求爸爸. #include<iostream> #include<cstring> ...
- UVA-10765 Doves and bombs (双连通分量)
题目大意:给一个n个点的无向连通图,找出删除某个点后的连通块个数. 题目分析:统计一下每个节点属于几个双连通分量,若是割点,得到的便是答案,否则答案为1. 代码如下: # include<ios ...
- poj2117求割点后最多的块。
tarjan算法,枚举割点(注意此题无向图可能不连通),每个割点分割后最大块数+连通分量-1即可.开始老是TLE,后来比较了他人代码,只在vector<vector<int.>.&g ...
- UVA - 315 Network(tarjan求割点的个数)
题目链接:https://vjudge.net/contest/67418#problem/B 题意:给一个无向连通图,求出割点的数量.首先输入一个N(多实例,0结束),下面有不超过N行的数,每行的第 ...
- 【模拟7.25】回家(tarjan V-DCC点双连通分量的求法及缩点 求割点)模板题
作为一道板子题放在第二题令人身心愉悦,不到一个小时码完连对拍都没打. 关于tarjan割点的注意事项: 1.在该板子中我们求的是V-DCC,而不是缩点,V-DCC最少有两个点组成,表示出掉一个块里的任 ...
- Codeforces Round #369 (Div. 2) D. Directed Roads dfs求某个联通块的在环上的点的数量
D. Directed Roads ZS the Coder and Chris the Baboon has explored Udayland for quite some time. The ...
- 链表加bfs求补图联通块
https://oj.neu.edu.cn/problem/1387 给一个点数N <= 100000, 边 <= 1000000的无向图,求补图的联通块数,以及每个块包含的点数 由于点数 ...
随机推荐
- C#生成XML的三种途径
C#生成XML的三种途径 为了全面,这里都将XML保存到文件中,有三种生成XML的方式: 1.我认为是最原始,最基本的一种:利用XmlDocument向一个XML文件里写节点,然后再利用XmlDocu ...
- Android studio错误及解决办法
错误: Cannot launch AVD in emulator. Output: emulator: ERROR: GPU emulation is disabled. Only screen s ...
- HTML 转义字符
在HTML中,一个包含特殊字符(如<>&)的字符串,要显示在页面上,由于添加到文本节点时会被认为是HTML的标签结构,造成一些错误,因此,要将这些特殊字符进行转义. 例如在< ...
- inner join跟where查询的区别
- Navicat 看历史执行SQL
Navicat可以通过这个框口看手动操作所执行的代码操作
- CI框架篇之控制器篇--设置路由(1)
CodeIgniter 定义默认控制器 当你的网站不存在某个URI 或者 用户直接从根目录访问的时候,CodeIgniter 会加载默认控制器. 打开 application/config/route ...
- c#中string.trimstart() 和string.trimend() 的用法
trim(),trimstart(),trimend()这样写是去掉空格,trimstart(a)是去掉字符串开始包含char[] a的字符,trimend同trimstart. 例:char[] a ...
- wcf入门教程
一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...
- Linux中一些目录名称的含义
挖Linux中的古老缩略语[2005-06-22 15:23][Nigel McFarlane][TechTarget] Unix已经有35年历史了.许多人认为它开始于中世纪,这个中世纪是相对于计算机 ...
- html-----001
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...