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

题目:

题意:

  给了一个联通无向图,现在问去掉某个点,会让图变成几个联通块?

  输出的按分出的从多到小,若相等,输出标号从小到大。输出M个。

分析:

  BCC求割点后联通块数量,Tarjan算法。

  联通块的数目在找到一个low[y]>=dfn[x]时累加,最后加一即可。

代码如下:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 #define Maxn 10010
 8
 9 int n,m;
10 int first[Maxn],low[Maxn],dfn[Maxn],fa[Maxn],son[Maxn];
11 int cut[Maxn];
12 int cnt;
13
14 struct node
15 {
16     int x,y,next;
17 };
18 node t[Maxn*10],ans[Maxn];
19 int len;
20
21 int mymin(int x,int y) {return x<y?x:y;}
22
23 void ins(int x,int y)
24 {
25     t[++len].x=x;t[len].y=y;
26     t[len].next=first[x];first[x]=len;
27 }
28
29 bool cmp(node x,node y) {return (x.x==y.x)?(x.y<y.y):(x.x>y.x);}
30
31 void ffind(int x,int f)
32 {
33     dfn[x]=low[x]=++cnt;
34     fa[x]=f;
35     for(int i=first[x];i;i=t[i].next) if(t[i].y!=f)
36     {
37         int y=t[i].y;
38         if(dfn[y]==0)
39         {
40             ffind(y,x);
41             son[x]++;
42             low[x]=mymin(low[x],low[y]);
43             if(low[y]>=dfn[x]) cut[x]++;
44         }
45         else low[x]=mymin(low[x],dfn[y]);
46     }
47 }
48
49 int main()
50 {
51     while(1)
52     {
53         scanf("%d%d",&n,&m);
54         if(n==0&&m==0) break;
55         len=0;cnt=0;
56         memset(first,0,sizeof(first));
57         while(1)
58         {
59             int a,b;
60             scanf("%d%d",&a,&b);
61             if(a==-1&&b==-1) break;
62             a++;b++;
63             ins(a,b);ins(b,a);
64         }
65         memset(dfn,0,sizeof(dfn));
66         memset(cut,0,sizeof(cut));
67         memset(son,0,sizeof(son));
68         ffind(1,0);ans[1].y=0;
69         if(son[1]>1) ans[1].x=son[1];
70         else ans[1].x=1;
71         for(int i=2;i<=n;i++)
72         {
73             ans[i].y=i-1;
74             ans[i].x=cut[i]+1;
75         }
76         sort(ans+1,ans+1+n,cmp);
77         for(int i=1;i<=m;i++) printf("%d %d\n",ans[i].y,ans[i].x);
78         printf("\n");
79     }
80     return 0;
81 }

[UVA10765]

2016-03-17 13:43:40

时间: 2024-11-05 12:09:58

【UVA10765】Doves and bombs (BCC求割点后联通块数量)的相关文章

poj 1523 SPF 求割点以及删除该割点后联通块的数量

SPF Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7136   Accepted: 3255 Description Consider the two networks shown below. Assuming that data moves around these networks only between directly connected nodes on a peer-to-peer basis, a

hdu 4587 2013南京邀请赛B题/ / 求割点后连通分量数变形。

题意:求一个无向图的,去掉两个不同的点后最多有几个连通分量. 思路:枚举每个点,假设去掉该点,然后对图求割点后连通分量数,更新最大的即可.算法相对简单,但是注意几个细节: 1:原图可能不连通. 2:有的连通分量只有一个点,当舍去该点时候,连通分量-1: 复习求割点的好题! #include<iostream> #include<cstdio> #include<vector> using namespace std; int n,m; vector<vector&

The Suspects——并查集求联通块数量的模板题

题目链接 题意: n个学生分属m个团体,一个学生可以属于多个团体.一个学生疑似患病,则他所属的整个团体都疑似患病.已知0号疑似患病,以及每个团体都有哪些学生构成,求一共有多少个学生疑似患病 题解: 很经典的并查集的题目,找一个num[]数组记录每一个以当前下标为根节点的集合的个体数目,最后输出0号的根节点对应的num值,就是0号学生所在团体的人数. 代码: #include<iostream> #include<stdio.h> #include<math.h> usi

UVA - 315 Network(tarjan求割点的个数)

题目链接:https://vjudge.net/contest/67418#problem/B 题意:给一个无向连通图,求出割点的数量.首先输入一个N(多实例,0结束),下面有不超过N行的数,每行的第一个数字代表后面的都和它存在边,0表示行输入的结束. 题解:简单的求割点模版,所谓割点就是去掉这一个点还有于这个点链接的边之后使得原来的图连通块增加. 由于这是模版题代码会加上注释. #include <iostream> #include <cstring> using namesp

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. They realize that it consists of n towns numbered from 1to n. There are n directed roads in the Udayland. i-th of them goes from town i to some other town 

链表加bfs求补图联通块

https://oj.neu.edu.cn/problem/1387 给一个点数N <= 100000, 边 <= 1000000的无向图,求补图的联通块数,以及每个块包含的点数 由于点数太大,补图会是稠密图,甚至建立补图都要O(n^2),只能挖掘一下联通块,bfs,补图的性质,从原图入手求补图的联通块: 在原图中不直接相邻的点,在补图中一定属于同一个联通块 每个点只属于一个联通块,所以找好一个联通块之后可以删去这个联通块的所有点,把图规模缩小 这样子:1.准备一个集合放所有未探索的点,初始化

poj1144 tarjan求割点 裸题

Network Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11684   Accepted: 5422 Description A Telephone Line Company (TLC) is establishing a new telephone cable network. They are connecting several places numbered by integers from 1 to N

连通分量模板:tarjan: 求割点 &amp;&amp; 桥 &amp;&amp; 缩点 &amp;&amp; 强连通分量 &amp;&amp; 双连通分量 &amp;&amp; LCA(最近公共祖先)

PS:摘自一不知名的来自大神. 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合. 3.点连通度:最小割点集合中的顶点数. 4.割边(桥):删掉它之后,图必然会分裂为两个或两个以上的子图. 5.割边集合:如果有一个边集合,删除这个边集合以后,原图变成多个连通块,就称这个点集为割边集合. 6.边连通度:一个图的边连通度的定义为,最

(转)Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)

本文转载自:http://hi.baidu.com/lydrainbowcat/item/f8a5ac223e092b52c28d591c 作者提示:在阅读本文之前,请确保您已经理解并掌握了基本的Tarjan算法,不会的请到http://hi.baidu.com/lydrainbowcat/blog/item/42a6862489c98820c89559f3.html阅读.   基本概念:   1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如