题目大意:给一个n个点的无向连通图,找出删除某个点后的连通块个数。

题目分析:统计一下每个节点属于几个双连通分量,若是割点,得到的便是答案,否则答案为1。

代码如下:

# include<iostream>
# include<cstdio>
# include<stack>
# include<vector>
# include<cstring>
# include<algorithm>
using namespace std;
# define REP(i,s,n) for(int i=s;i<n;++i)
# define CL(a,b) memset(a,b,sizeof(a)); const int N=10005;
struct Edge
{
int u,v;
Edge(int _u,int _v):u(_u),v(_v){}
bool operator < (const Edge &a) const {
if(v==a.v) return u<a.u;
return v>a.v;
}
};
stack<Edge>S;
vector<Edge>ans;
vector<int>G[N],bcc[N];
int n,m,dfs_cnt,bcc_cnt,bccno[N],pre[N],low[N],cnt[N],iscut[N]; void dfs(int u,int fa)
{
low[u]=pre[u]=++dfs_cnt;
int child=0;
REP(i,0,G[u].size()){
int v=G[u][i];
if(pre[v]==0){
++child;
S.push(Edge(u,v));
dfs(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>=pre[u]){
iscut[u]=1;
bcc[++bcc_cnt].clear();
while(1){
Edge x=S.top();
S.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){
S.push(Edge(u,v));
low[u]=min(low[u],pre[v]);
}
}
if(fa<0&&child==1) iscut[u]=0;
} void findBcc()
{
CL(bccno,0);
CL(iscut,0);
CL(pre,0);
dfs_cnt=bcc_cnt=0;
REP(i,0,n) if(!pre[i])
dfs(i,-1);
} int main()
{
int a,b;
while(scanf("%d%d",&n,&m)&&(n+m))
{
REP(i,0,n) G[i].clear();
while(scanf("%d%d",&a,&b))
{
if(a==-1&&b==-1)
break;
G[a].push_back(b);
G[b].push_back(a);
}
findBcc();
ans.clear();
CL(cnt,0);
REP(i,1,bcc_cnt+1) REP(j,0,bcc[i].size()) ++cnt[bcc[i][j]];
REP(i,0,n){
if(iscut[i])
ans.push_back(Edge(i,cnt[i]));
else
ans.push_back(Edge(i,1));
}
sort(ans.begin(),ans.end());
REP(i,0,m) printf("%d %d\n",ans[i].u,ans[i].v);
printf("\n");
}
return 0;
}

  

UVA-10765 Doves and bombs (双连通分量)的更多相关文章

  1. UVA 10765 Doves and bombs(双连通分量)

    题意:在一个无向连通图上,求任意删除一个点,余下连通块的个数. 对于一个非割顶的点,删除之后,原图仍连通,即余下连通块个数为1:对于割顶,余下连通块个数>=2. 由于是用dfs查找双连通分量,树 ...

  2. UVA 10765 Doves and bombs

    给定一个无向的连通图,要求每个点去掉后连通分量的数目,然后输出连通分量最多的m个点. 分析: 先求出双连通分量,然后统计所有双连通分量中割顶出现的次数,最后求出的就是割顶去掉后剩下的双连通的数目,对于 ...

  3. UVA 10765 Doves and bombs 割点

    最近好懒,堆了好多题没写题解.. 原题链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8& ...

  4. uva 10765 Doves and Bombs(割顶)

     题意:给定一个n个点的连通的无向图,一个点的"鸽子值"定义为将它从图中删去后连通块的个数.求每一个点的"鸽子值". 思路dfs检查每一个点是否为割顶,并标 ...

  5. UVA 10972 - RevolC FaeLoN(边-双连通分量)

    UVA 10972 - RevolC FaeLoN option=com_onlinejudge&Itemid=8&page=show_problem&category=547 ...

  6. 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP)

    layout: post title: 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP) author: "luowentaoaa" catalog: true ...

  7. uva 10972(边双连通分量)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33804. 思路:和poj的一道题有点像,不过这道题图可能不连通,因 ...

  8. LA 3523 圆桌骑士(二分图染色+点双连通分量)

    https://vjudge.net/problem/UVALive-3523 题意: 有n个骑士经常举行圆桌会议,商讨大事.每次圆桌会议至少应有3个骑士参加,且相互憎恨的骑士不能坐在圆桌旁的相邻位置 ...

  9. poj 2942 Knights of the Round Table(无向图的双连通分量+二分图判定)

    #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #includ ...

随机推荐

  1. xshell连接centos虚拟机

    打开centos终端,输入ifconfig 如果没有这条命令可以输入ip address en什么什么的表示设备名称 inet后面跟着的就是ip地址 复制ip地址,打开xshell,新建,在主机中输入 ...

  2. zip解压破解

    B2TQZJEpzFAUHcHaTQRjtKi8C4Q5mpFsBFLYsNTfCs7ZD65X

  3. 【转】阿里巴巴技术专家杨晓明:基于Hadoop技术进行地理空间分析

    转自:http://www.csdn.net/article/2015-01-23/2823687-geographic-space-base-Hadoop [编者按]交通领域正产生着海量的车辆位置点 ...

  4. LRU算法---缓存淘汰算法

    计算机中的缓存大小是有限的,如果对所有数据都缓存,肯定是不现实的,所以需要有一种淘汰机制,用于将一些暂时没有用的数据给淘汰掉,以换入新鲜的数据进来,这样可以提高缓存的命中率,减少磁盘访问的次数. LR ...

  5. springmvc获取bean

    1.普通注解方式获取 2.springcontextholder获取 ChatHistoryService chatHistoryService = SpringContextHolder.getBe ...

  6. 获取浏览器版本型号(C#)

    private string GetClientBrowserVersions() { string browserVersions = string.Empty; HttpBrowserCapabi ...

  7. 算法+OpenCV】基于opencv的直线和曲线拟合与绘制(最小二乘法)

    http://blog.csdn.net/guduruyu/article/details/72866144 最小二乘法多项式曲线拟合,是常见的曲线拟合方法,有着广泛的应用,这里在借鉴最小二乘多项式曲 ...

  8. 关于Linq的对List<实体>去掉重复ID的一个小例子!

    注意 下面的代码只要ID相同(即使其他的不相同)都会过滤掉,简单来讲就是过滤掉ID相同的实体,如果ID相同,其他属性取第一个的值 List<Abc> list = new List< ...

  9. 20145331 《Java程序设计》第6周学习总结

              20145331 <Java程序设计>第6周学习总结 教材学习内容总结 第十章 输入/输出 10.1.1串流 •Java将输入/输出抽象化为串流,数据有来源及目的地,衔 ...

  10. platform_device和platform_driver的注册过程,及probe函数何时调用的分析 ⭐⭐⭐

    add  platform_device之后,需要注意的一个地方是这里,add是通过系统初始化里边调用platform_add_devices把所有放置在板级platform_device数组中的所有 ...