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 ...
随机推荐
- iOS开发之深入探讨runtime机制02-runtime的简单使用
runtime机制为我们提供了一系列的方法让我们可以在程序运行时动态修改类.对象中的所有属性.方法. 下面就介绍运行时一种很常见的使用方式,字典转模型.当然,你可能会说,“我用KVO直接 setVal ...
- nginx去掉单个目录和多个目录PHP执行权限方法
我们经常希望某些目录不能执行php代码,如果是nginx的话,我们怎么设置Nginx对于某些目录禁止执行PHP权限呢.以前不知道,其实nginx去掉单个目录和多个目录PHP执行权限方法也很简单. 首先 ...
- winform窗口打开后文本框的默认焦点设置
原文:http://blog.csdn.net/kongwei521/article/details/6871411 winform窗口打开后文本框的默认焦点设置,进入窗口后默认聚焦到某个文本框,两种 ...
- Proxmox虚拟机增加硬盘容量
1.首先在虚拟机控制台选择调整硬盘容量,弹出窗口为增加的容量 2.重启虚拟机,用fdisk –l查看新增容量是否被识别 3.用cfdisk创建分区,分区格式为Primary 8e (Linux LVM ...
- 暑假集训单切赛第二场 UVA 10982 Troublemakers
题意:将点放在两个集合,同一个集合的边保留,不同集合的边删去,使得边至少减少一半. 输出任何一种方案即可.如果不能,输出Impossible 思路:设如果两个人为一对捣蛋鬼,则two[i][j]=t ...
- 【转载】SSH框架总结(将网上朋友写的给整合了下)
一.Struts 在没有学习SSH框架前,我们一般采用Jsp+javabean+servlet开发,这里就是MVC架构.而Struts其实就是替代了Servlet,我们知道Servlet在一般的开发中 ...
- cojs 简单的区间问题 解题报告
新学了些弦图和区间图的新玩意,于是就想着出一道题目 其实这道题不用弦图和区间图的理论也是可以做的 首先考虑第一问,第一问是一个NOIP普及组水平的贪心 我们把区间按照右端点从小到大排序,之后从头到尾扫 ...
- Visual StudioTools for Unity 使用技巧2
在之前的博客介绍了 Visual Studio Tools for Unity的安装和使用. http://www.cnblogs.com/petto/p/3886811.html 其实这个工具还提供 ...
- python 下划线的使用(转载:安生犹梦 新浪博客)
Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx 不能用'from module import *'导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核 ...
- Android Handler之Message传递参数
最近发现Message,发送消息可以传递参数,这个思路很好,所以写了一个例子,点击屏幕,给Activity发送一个消息,传递两个参数,并把这个activity销毁掉! 程序打开界面: 点击屏幕,销毁a ...