题目大意:给一个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. appium格式化循环点击

  2. IOS中程序如何进行推送消息(本地推送,远程推送)2(下)

    内容中包含 base64string 图片造成字符过多,拒绝显示

  3. zen-cart安装出现时区错误解决办法

    有时候在安装zen-cart的时候出现时区错误,提示: ERROR: date.timezone not set in php.ini. Please contact your hosting com ...

  4. ajax示例

    ajax(Asynchronous Javascript And XML)翻译成中文就是异步的javascript和XML,即用javascript语言与服务器进行异步交互,传输的数据为XML(当然, ...

  5. node的3大作用域

    除了持久性存储外,想要内存也可以存入数据,来做计算什么数据都存入访问一便数据库,效率就太低了 java有3大作用域request 指在一次请求的全过程中有效,即从http请求到服务器处理结束,返回响应 ...

  6. Python的socket网络编程(一)

    (注:本文部分内容摘自互联网,由于作者水平有限,不足之处,还望留言指正.) 先写首诗,抒抒情. 一. 食堂.校园 见过你那么多次 卑微的我 只敢偷偷瞄上一眼 心扑通 扑通 春天真好 不是么 二. 学子 ...

  7. 一只代码小白git托管路上的二三事

    [经验]一只代码小白git托管路上的二三事 写在前面的话 寒假的时候,娄老师给我们布置了代码托管的作业,并要求把托管地址发给学委.因假期的时候没有带电脑回家,所以只是在手机上草草注册了,也稀里糊涂就将 ...

  8. JS正则表达式从入门到入土(6)—— 贪婪模式与非贪婪模式

    贪婪模式 之前说了正则的量词,但是量词会带来一个到底该匹配哪个的问题. 如下正则表达式: \d{3,6} 这个正则表达式是匹配3到6个数字,但是当这个正则表达式被用来匹配12345678这个字符串,到 ...

  9. jQuery :gt 选择器 jQuery :lt 选择器

    选择前 3 个之后的所有 <tr> 元素: $("tr:gt(2)"); 选择前 2 个 <tr> 元素: $("tr:lt(2)");

  10. linux 安装vscode

    滚动安装vscode 需要先添加源,然后install 以centos为例: sudo rpm --import https://packages.microsoft.com/keys/microso ...