UVa 10765 鸽子和炸弹(割点)

https://vjudge.net/problem/UVA-10765

题意:

给一个n个点的无向图,求每个点删去后形成的连通分量数。

思路:

判断割点,如果是割点的话,在dfs的时候计算出删去它后所形成的连通分量数。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<stack>
 7 #include<queue>
 8 #include<cmath>
 9 #include<map>
10 using namespace std;
11
12 const int maxn=1e4+5;
13
14 struct node
15 {
16     int id;
17     int ge;
18 }d[maxn];
19
20 int n,m;
21 int pre[maxn],cut[maxn],low[maxn];
22 int degree[maxn];
23 int dfs_block;
24 vector<int> G[maxn];
25
26 int dfs(int u,int fa)
27 {
28     int lowu=pre[u]=++dfs_block;
29     int child=0;
30     for(int i=0;i<G[u].size();i++)
31     {
32         int v=G[u][i];
33         if(!pre[v])
34         {
35             child++;
36             int lowv=dfs(v,u);
37             lowu=min(lowu,lowv);
38             if(lowv>=pre[u])
39             {
40                 cut[u]++;
41             }
42         }
43         else if(pre[v]<pre[u] && v!=fa)
44             lowu=min(lowu,pre[v]);
45     }
46     if(fa < 0 && child==1)  cut[u]=1;
47     low[u]=lowu;
48     return lowu;
49 }
50
51 bool cmp(node a,node b)
52 {
53     return a.ge>b.ge||(a.ge==b.ge&&a.id<b.id);
54 }
55
56 int main()
57 {
58     //freopen("D:\\input.txt","r",stdin);
59     while(~scanf("%d%d",&n,&m)&& n && m)
60     {
61         for(int i=0;i<n;i++)  {G[i].clear();cut[i]=1;}
62         int u,v;
63         while(true)
64         {
65             scanf("%d%d",&u,&v);
66             if(u==-1 && v==-1) break;
67             G[u].push_back(v);
68             G[v].push_back(u);
69         }
70         memset(pre,0,sizeof(pre));
71         memset(low,0,sizeof(low));
72         dfs(0,-1);
73         for(int i=0;i<n;i++)
74         {
75             d[i].id=i;
76             d[i].ge=cut[i];
77         }
78         sort(d,d+n,cmp);
79         for(int i=0;i<m;i++)
80             printf("%d %d\n",d[i].id,d[i].ge);
81         printf("\n");
82     }
83     return 0;
84 }
时间: 2024-08-24 12:06:25

UVa 10765 鸽子和炸弹(割点)的相关文章

UVA 10765 Doves and bombs 割点

最近好懒,堆了好多题没写题解.. 原题链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1706 题意: 给你一个图,问你每个点去掉后有多少个联通块 题解: 就Tarjan一下就好,很简单 代码: #include<iostream> #include<cstring> #include<vector>

Uva 10765 点双连通求删任意点后剩下图中的连通分量数

题目挂在wustoj上,不知道什么原因不能粘贴链接.. 第一题题号为1314..这题是智力题...换成7的阶乘就可以了.. 代码如下. #include<cstdio> int main() { printf("...............................................................................................\n"); printf("..#................

Uva 315 求无向图的割点的个数

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=251 A Telephone Line Company (TLC) is establishing a new telephone cable network. They are connecting several places numbered by integers from 1 to 

uva 10765 Doves and Bombs(割顶)

?? 题意:给定一个n个点的连通的无向图,一个点的"鸽子值"定义为将它从图中删去后连通块的个数.求每一个点的"鸽子值". 思路dfs检查每一个点是否为割顶,并标记除去该点后有多少个连通分量 #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm&

POJ 1144 &amp; Uva 315 Network 【求割点数目】

Network Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10855   Accepted: 5020 链接:http://poj.org/problem?id=1144 Description A Telephone Line Company (TLC) is establishing a new telephone cable network. They are connecting several places

UVA - 10765 Doves and bombs (双联通分量)

链接 :  http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34798 给N个点的无向图并且联通,问删除每次一个点之后还剩多少联通分量. 找割顶 如果删除的是割顶 联通分量就会增加,否则还是1(因为原图是联通图),删除割顶之后 联通块的数目 就要看该割顶在几个双联通分量里出现过. #pragma comment(linker, "/STACK:10240000,10240000") #include <a

10765 - Doves and bombs(双连通分量)

UVA 10765 - Doves and bombs 题目链接 题意:给定一个无向图,每个点的鸽子值为删去这个点后会有几个连通块,问鸽子值前m大的点的鸽子值,如果相同,按编号排 思路:就裸的双连通分量,在每个连通分量如果是割顶的点就加一,最后如果答案为0的点,答案应该是1 代码: #include <cstdio> #include <cstring> #include <vector> #include <stack> #include <algo

【吃炸弹的鸽子UVA10765-双联通模板】

·从前有一个鸽子Lence,它吃了一个炸弹,然后有人出了这道题. ·英文题,述大意:        给出一张连通无向图,求出:对于每个点,删去这个点(以及它相连的边以后)时,当前图中的连通块数量,这个值作为该点的Lence值.输出根据Lence值从大到小(相同时标号从小到大)的前m个点和它的Lence值. ·分析:       关于连通块问题,可以寻得三种方法:       ①嘎嘣脆算法(Gabow)②塔尔杨算法(Tarjan)③Kosaraju算法.        此处大米饼采用Tarjan算

UESTC 900 方老师炸弹 --Tarjan求割点及删点后连通分量数

Tarjan算法. 1.若u为根,且度大于1,则为割点 2.若u不为根,如果low[v]>=dfn[u],则u为割点(出现重边时可能导致等号,要判重边) 3.若low[v]>dfn[u],则边(u,v)为桥(封死在子树内),不操作. 求割点时,枚举所有与当前点u相连的点v: 1.是重边: 忽略 2.是树边: Tarjan(v),更新low[u]=min(low[u],low[v]); 子树个数cnt+1.如果low[v] >= dfn[u],说明是割点,割点数+1 3.是回边: 更新lo