UVA 10765 Doves and bombs(双连通分量)
题意:在一个无向连通图上,求任意删除一个点,余下连通块的个数。
对于一个非割顶的点,删除之后,原图仍连通,即余下连通块个数为1;对于割顶,余下连通块个数>=2。
由于是用dfs查找双连通分量,树形结构是向下搜素,所以在dfs过程中不便于统计割顶所分连通分量的个数。换一个角度,通过在vector<int>bcc中保存各个双连通分量的点,统计各个点出现的次数即可。(除割顶外,每个点只可能出现一次)
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<vector>
- #include<stack>
- using namespace std;
- const int MAXN= ;
- struct Edge{
- int u,v;
- Edge(){}
- Edge(int _u,int _v):u(_u),v(_v){}
- };
- struct Cut{
- int c,w;
- }cut[MAXN];
- int iscut[MAXN],pre[MAXN],low[MAXN],dfs_clock,bcc_cnt,bccno[MAXN];
- int son;
- vector<int >G[MAXN],bcc[MAXN];
- stack<Edge>stk;
- void dfs(int u,int fa)
- {
- pre[u]=low[u]=dfs_clock++;
- son=;
- for(int i=;i<G[u].size();i++)
- {
- int v=G[u][i];
- Edge e=Edge(u,v);
- if(!pre[v]){
- stk.push(e);
- son++;
- dfs(v,u);
- low[u]=min(low[u],low[v]);
- if(low[v]>=pre[u]){
- iscut[u]=;
- bcc_cnt++;
- bcc[bcc_cnt].clear();
- while()
- {
- Edge x=stk.top();
- stk.pop();
- if(bccno[x.u]!=bcc_cnt){
- bcc[bcc_cnt].push_back(x.u);
- bccno[x.u]=bcc_cnt;
- }
- if(bccno[x.v]!=bcc_cnt){
- bcc[bcc_cnt].push_back(x.v);
- bccno[x.v]=bcc_cnt;
- }
- if(x.u==u&&x.v==v)
- break;
- }
- }
- }else if(pre[v]<pre[u]&&v!=fa){
- stk.push(e);
- low[u]=min(low[u],pre[v]);
- }
- }
- if(fa==-&&son==)
- iscut[u]=;
- }
- void find_bcc(int n)
- {
- bcc_cnt=dfs_clock=;
- memset(pre,,sizeof(pre));
- memset(bccno,,sizeof(bccno));
- memset(iscut,,sizeof(iscut));
- memset(cut,,sizeof(cut));
- for(int i=;i<n;i++)
- if(!pre[i])
- dfs(i,-);
- }
- int cmp(Cut a,Cut b)
- {
- if(a.w==b.w)
- return a.c<b.c;
- return a.w>b.w;
- }
- int main()
- {
- int n,m,x,y;
- while(~scanf("%d%d",&n,&m))
- {
- if(!n&&!m)
- return ;
- for(int i=;i<n;i++)
- G[i].clear();
- while()
- {
- scanf("%d%d",&x,&y);
- if(x==-&&y==-)
- break;
- G[x].push_back(y);
- G[y].push_back(x);
- }
- find_bcc(n);
- for(int i=;i<=bcc_cnt;i++)
- {
- for(int j=;j<bcc[i].size();j++)
- {
- cut[bcc[i][j]].c=bcc[i][j];
- cut[bcc[i][j]].w++;
- }
- }
- sort(cut,cut+n,cmp);
- for(int i=;i<m;i++)
- printf("%d %d\n",cut[i].c,cut[i].w);
- puts("");
- }
- return ;
- }
UVA 10765 Doves and bombs(双连通分量)的更多相关文章
- UVA 10765 Doves and bombs
给定一个无向的连通图,要求每个点去掉后连通分量的数目,然后输出连通分量最多的m个点. 分析: 先求出双连通分量,然后统计所有双连通分量中割顶出现的次数,最后求出的就是割顶去掉后剩下的双连通的数目,对于 ...
- UVA 10765 Doves and bombs 割点
最近好懒,堆了好多题没写题解.. 原题链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8& ...
- uva 10765 Doves and Bombs(割顶)
题意:给定一个n个点的连通的无向图,一个点的"鸽子值"定义为将它从图中删去后连通块的个数.求每一个点的"鸽子值". 思路dfs检查每一个点是否为割顶,并标 ...
- UVA-10765 Doves and bombs (双连通分量)
题目大意:给一个n个点的无向连通图,找出删除某个点后的连通块个数. 题目分析:统计一下每个节点属于几个双连通分量,若是割点,得到的便是答案,否则答案为1. 代码如下: # include<ios ...
- UVA 10972 - RevolC FaeLoN(边-双连通分量)
UVA 10972 - RevolC FaeLoN option=com_onlinejudge&Itemid=8&page=show_problem&category=547 ...
- 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP)
layout: post title: 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP) author: "luowentaoaa" catalog: true ...
- uva 10972(边双连通分量)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33804. 思路:和poj的一道题有点像,不过这道题图可能不连通,因 ...
- LA 3523 圆桌骑士(二分图染色+点双连通分量)
https://vjudge.net/problem/UVALive-3523 题意: 有n个骑士经常举行圆桌会议,商讨大事.每次圆桌会议至少应有3个骑士参加,且相互憎恨的骑士不能坐在圆桌旁的相邻位置 ...
- poj 2942 Knights of the Round Table(无向图的双连通分量+二分图判定)
#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #includ ...
随机推荐
- MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能
MYSQL-实现ORACLE- row_number() over(partition by ) 分组排序功能 由于MYSQL没有提供类似ORACLE中OVER()这样丰富的分析函数. 所以在MYSQ ...
- Codeforces Round #348 (VK Cup 2016 Round 2, Div. 2 Edition) D. Little Artem and Dance
题目链接: http://codeforces.com/contest/669/problem/D 题意: 给你一个初始序列:1,2,3,...,n. 现在有两种操作: 1.循环左移,循环右移. 2. ...
- jQuery+css+div--一些细节详解
(一).首先.让我们认识一下最基本普通的alert()弹出框!(改变alert()提示弹出框的样式) 我们在写html或是jsp页面的时候,谁都不希望自己精心设计,且非常美观的页面颜色布局被破坏掉吧! ...
- Unity3d游戏中添加移动MM支付SDK问题处理
原地址:http://www.tuicool.com/articles/I73QFb 由于移动mm的SDK将部分资源文件放在jar包中,导致Unity无法识别,提示failed to find res ...
- 使用mysql触发器脚本,解决流水数据的添加。
1.建立表脚本 CREATE DATABASE `spring` DEFAULT CHARACTER SET utf8; USE `spring`; CREATE TABLE `account` ( ...
- solr4.5部署
一.服务器部署 1.solr自带jetty服务器上部署 cd到solr-4.5.0\example目录下,运行java -jar start.jar即可运行jetty服务器.访问http://loca ...
- D&F学数据结构系列——插入排序
插入排序(insertion sort) 插入排序由P-1趟(pass)排序组成.对于P=1趟到P=N-1趟,插入排序保证从位置0到位置P-1上的元素为已排序状态.插入排序利用了这样的事实:位置0到位 ...
- **CI两种方式查询所返回的结果数量
区别:第一个是有条件的:第二个没有条件 $this->db->count_all_results(); 允许你获得某个特定的Active Record查询所返回的结果数量.可以使用Acti ...
- POJ2418Hardwood Species
题意 : 输入若干个树木品种,里边有的是重复的,让你统计每个品种占输入的总数量的百分比,最后按字典序输出 思路 : 本题数量很大,所以采用直接统计的方式会超时,而采用的方法可以用二叉搜索树,或者用ma ...
- ZOJ 2563 Long Dominoes(状压DP)
给定一个m*n的方格子,要求用3*1的骨牌去覆盖,骨牌可以用横放或者竖放,问最终有多少种放置方式,将其铺满. 分析:由于最多30行,每行最多9列,所以可以按行来dp,设计每行的状态从而进行转移,考虑每 ...