poj 2117 去掉割点可以分得的联通图的个数模板
#include<stdio.h>
#include<string.h>
#define N 11000
/*
去掉一个割点后,询问可以分得的联通图的个数
*/
struct node {
int u,v,next;
}bian[N*100];
/*cut数组记录去掉某个节点后可以增加的联通分支的个数,num数组记录以i为根节点的联通图的元素的个数*/
int head[N],n,yong,cou,index,dfn[N],low[N],cut[N],num[N];
void init() {
yong=0;index=0;cou=0;
memset(head,-1,sizeof(head));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(num,0,sizeof(num));
memset(cut,0,sizeof(cut));
}
int Min(int a,int b) {
return a>b?b:a;
}
void addedge(int u,int v) {
bian[yong].u=u;
bian[yong].v=v;
bian[yong].next=head[u];
head[u]=yong++;
}
void tarjan(int u,int pre) {
int i;
dfn[u]=low[u]=++index;
cou++;
if(pre<0)//根节点去掉后无影响,或则单个孤立节点的计算标记
cut[u]--;
for(i=head[u];i!=-1;i=bian[i].next) {
int v=bian[i].v;
if(!dfn[v]) {
tarjan(v,u);
low[u]=Min(low[u],low[v]);
if(low[v]>=dfn[u])//割点去掉后可增加联通分量
cut[u]++;
}
else
low[u]=Min(low[u],dfn[v]);
}
}
int main(){
int m,a,b,i,flag,ans,sum;
while(scanf("%d%d",&n,&m),n||m) {
init();
while(m--) {
scanf("%d%d",&a,&b);
a++;b++;
addedge(a,b);
addedge(b,a);
}
sum=0;
for(i=1;i<=n;i++)
if(!dfn[i]) {
cou=0;
sum++;//记录有多少个联通块
tarjan(i,-1);
num[i]=cou;//记录以i为根节点的联通分量的元素的个数
}
int flag=-1;
ans=0;
for(i=1;i<=n;i++)
if(cut[i]) {//只判断有影响的点包括割点,单独孤立的点等
if(ans<cut[i]+1) {//计算可以增加的联通分量
flag=i;
ans=cut[i]+1;
}
}
if(flag==-1) {//如果不能增加,如全部是孤立的节点,或者双联通这样的特殊情况
flag=0;
for(i=1;i<=n;i++)
if(num[i]>1)//是否双联通这种情况,去掉任意一个不影响结果
flag++;
if(flag)
printf("%d\n",sum);
else
printf("%d\n",sum-1);//说明全部都是孤立的点
}
else
printf("%d\n",ans+sum-1);
}
return 0;
}
poj 2117 去掉割点可以分得的联通图的个数模板的更多相关文章
- POJ 1523 SPF (去掉割点能形成联通块的个数)
思路:使用tarjan算法求出割点,在枚举去掉每一个割点所能形成的联通块的个数. 注意:后来我看了下别的代码,发现我的枚举割点的方式是比较蠢的方式,我们完全可以在tarjan过程中把答案求出来,引入一 ...
- Electricity POJ - 2117 + SPF POJ - 1523 去除割点后求强连通分量个数问题
Electricity POJ - 2117 题目描述 Blackouts and Dark Nights (also known as ACM++) is a company that provid ...
- POJ 2117 (割点+连通分量)
题目链接: http://poj.org/problem?id=2117 题目大意:在一个非连通图中,求一个切除图中任意一个割点方案,使得图中连通分量数最大. 解题思路: 一个大陷阱,m可以等于0,这 ...
- poj 1144 Network(割点)
题目链接: http://poj.org/problem?id=1144 思路分析:该问题要求求出无向联通图中的割点数目,使用Tarjan算法即可求出无向联通图中的所有的割点,算法复杂度为O(|V| ...
- poj 1523Tarjan算法的含义——求取割点可以分出的连通分量的个数
poj 1523Tarjan算法的含义——求取割点可以分出的连通分量的个数 题目大意:如题目所示 给你一些关系图——连通图,想要问你有没有个节点,损坏后,可以生成几个互相独立的网络(也就是连通分量), ...
- POJ 1523 SPF 割点 Tarjan
SPF Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9317 Accepted: 4218 Description C ...
- poj 2117 Electricity【点双连通求删除点后最多的bcc数】
Electricity Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4727 Accepted: 1561 Descr ...
- poj 1523求割点
题意:给出一个无向图,求割点以及去除这个点后图分为几部分: 思路:割点定义:去掉该点后图将分成几个部分.割点:(1)当k为根节点且有>1个分支,则去除该点后图便被分成几个分支.(2)DFN[v] ...
- 【BZOJ】2730: [HNOI2012]矿场搭建【Tarjan找割点】【分联通块割点个数】
2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3230 Solved: 1540[Submit][Stat ...
随机推荐
- HTML如何让IMG自动适应DIV容器大小
版权声明:本文为博主原创文章,未经博主允许不得转载.作者:沙师弟专栏 https://blog.csdn.net/u014597198/article/details/80403946HTML如何让I ...
- oc25--私有变量私有方法
// // Person.h #import <Foundation/Foundation.h> @interface Person : NSObject { @public int _a ...
- FFT模板——copied from hzwer
/* Welcome Hacking Wish You High Rating */ #include<iostream> #include<cstdio> #include& ...
- NSURLSession 和 NSURLConnection 的比较
一.NSURLConnection 1.iOS2.0出现,iOS9.0后废弃的网络请求发送方式 2.可以在初始化时确定发送同步还是异步的请求,并且可以选择执行队列. +(void)sendAsynch ...
- Django day08 多表操作 (四) 一对多, 多对多连续跨表查询
一对多 # 基于双下划线的一对多查询 # 查询出版社为上海出版社的所有图书 # ret = Publish.objects.filter(name='上海出版社').values('book__nam ...
- C# 标准命名规范
笔者从事开发多年,有这样一种感觉,查看一些开源项目,如Spring.Apache Common等源码是一件赏心悦目的事情,究其原因,无外两点:1)代码质量非常高:2)命名特别规范(这可能跟老外的英语水 ...
- C#三种创建对象方法所需时间比较。。。。。
C#创建对象的三种方法 new().Activator.Assembly,接下来通过代码直接来看看运行的速度.... 首先,先看看三种创建对象实例的方法: //new(); public stati ...
- 重装系统后快速安装.NET 3.5
每一次重装系统(Windows 8.1 和Windows 10)之后,最让我头疼的一件事就是配置把一大堆软件装上了.通常我会装好SQL Server之后,把电脑放在工作组安装Visual Studio ...
- mysql主从不同步,提示更新找不到记录
查看丛库状态show slave status\G 从库原文提示:Last_Error: Coordinator stopped because there were error(s) in the ...
- 【Linux】修改Linux操作系统字符集与Oracle数据库一致
#数据库中查看所使用字符集 SQL> select userenv('language') from dual; USERENV('LANGUAGE') -------------------- ...