试题描述
求一个图删除一个点之后,联通块最多有多少。
输入
多组数据。第一行两个整数 P,C 表示点数和边数。
接下来 C 行每行两个整数 p1,p2,表示 p1 与 p2 有边连接,保证无重边。读入以 0 0 结束。
输出
输出若干行,表示每组数据的结果。
输入示例
3 3
0 1
0 2
2 1
4 2
0 1
2 3
3 1
1 0
0 0
输出示例
1
2
2

详解参考https://blog.csdn.net/u013480600/article/details/30976823。

在dfs的时候,我们用cut[i]==X表示在dfs树中当i节点被删除时,i节点的X个儿子被切割开来(可以认为cut[i]是i节点与它的儿子连接的桥边的数目)。注意:如果i是根且其儿子只有1个,虽然i不是割点,cut[i]依然=1。如果i节点非割点,那么cut[i]=0。如果i是割点,那么cut[i]就是i被删除后将割出来的儿子数目。

然后我们求出了每个点的cut[i]值,即i点被删除,会有cut[i]个儿子树被割出来。如果i是dfs树的非根节点,那么cut[i]== 切除i之后增加的连通分量数目。如果i是dfs树的根节点,那么cut[i]-1才是切除i之后增加的连通分量数目(想想是不是)。

如果原始cut[i]=0,表示i是孤立的一点,此时cut[i]-1=-1.

如果原始cut[i]=1,表示i为根且有一个儿子,此时cut[i]-1=0.

如果原始cut[i]>=2,表示i为根且分割了>=2个儿子,此时cut[i]-1>=1.

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#define MAXN 100010
#define REP(i,k,n) for(int i=k;i<=n;i++)
#define in(a) a=read()
using namespace std;
inline int read(){
int f=,x=;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=-;
for(;isdigit(ch);ch=getchar())
x=x*+ch-'';
return x*f;
}
int n,m,cnt,ans;
int total=,head[MAXN],to[MAXN<<],nxt[MAXN<<];
int dfn[MAXN],low[MAXN],sum[MAXN];
inline void adl(int a,int b){
total++;
to[total]=b;
nxt[total]=head[a];
head[a]=total;
return ;
}
inline void tarjan(int u,int f){
low[u]=dfn[u]=++cnt;
for(int e=head[u];e;e=nxt[e]){
if(!dfn[to[e]]){
tarjan(to[e],u);
low[u]=min(low[to[e]],low[u]);
if(low[to[e]]>=dfn[u]) sum[u]++;
}
else if(to[e]!=f) low[u]=min(low[u],dfn[to[e]]);
}
return ;
}
int main(){
while(scanf("%d%d",&n,&m)){
if(n== && m==) return ;
int a,b;
total=cnt=ans=;
memset(head,,sizeof(head));
memset(dfn,,sizeof(head));
memset(low,,sizeof(low));
memset(sum,,sizeof(sum));
REP(i,,m){
in(a);in(b);
adl(a,b);
adl(b,a);
}
int num=;
ans=-;
REP(i,,n-)
if(!dfn[i]){
num++;
tarjan(i,-);
sum[i]--;
}
REP(i,,n-) ans=max(ans,sum[i]);
cout<<ans+num<<endl;
}
return ;
}

poj2117 Electricity的更多相关文章

  1. 无向连通图求割点(tarjan算法去掉改割点剩下的联通分量数目)

    poj2117 Electricity Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3603   Accepted: 12 ...

  2. Tarjan求割点和桥

    by szTom 前置知识 邻接表存储及遍历图 tarjan求强连通分量 割点 割点的定义 在一个无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多, ...

  3. 备战noip week8

    POJ1144 网络 description: 给出一张\(N\)个点的无向图,求其中割点的个数 data range: \(N\le 100\) solution: 一道模板题(但是读入实在是把我恶 ...

  4. poj 2117 Electricity【点双连通求删除点后最多的bcc数】

    Electricity Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4727   Accepted: 1561 Descr ...

  5. 【POJ】2117 Electricity

    无向图求割点和连通块. /* POJ2117 */ #include <iostream> #include <vector> #include <algorithm&g ...

  6. TZOJ 2546 Electricity(去掉割点后形成的最大连通图数)

    描述 Blackouts and Dark Nights (also known as ACM++) is a company that provides electricity. The compa ...

  7. electricity meter就是电表

    英式英语metre意思是度量衡里面的单位:米 美式英语拼为 meter 除了“米”,还有一个意思是“计量器”,比如 parking meter就是是路边停车投币计时器,cab meter就是出租车的计 ...

  8. POJ—— 2117 Electricity

    Electricity Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5620   Accepted: 1838 Descr ...

  9. Electricity POJ - 2117 + SPF POJ - 1523 去除割点后求强连通分量个数问题

    Electricity POJ - 2117 题目描述 Blackouts and Dark Nights (also known as ACM++) is a company that provid ...

随机推荐

  1. xargs -i 和-I 的区别【转】

    xargs与find经常结合来进行文件操作,平时删日志的时候只是习惯的去删除,比如  # find . -type f -name "*.log" | xargs rm -rf * ...

  2. Enumeration的学习

    枚举是jdk5.0之后的新特性.枚举的使用在编程中能起到很大的作用,本文从枚举的适用范围.枚举的特点.枚举的使用等三个方面学习枚举 一.枚举的使适用范围 “在有限的范围内选择值”:比如一个星期只有星期 ...

  3. Logistic回归与梯度上升算法

    原创作品出处 原始出处 .作者信息和本声明.否则将追究法律责任.http://sbp810050504.blog.51cto.com/2799422/1608064 Logistic回归与梯度上升算法 ...

  4. FreeMarker使用之比较if

    1. =或者==:判断两个值是否相等. 2. !=:判断两个值是否不等. 3. >或者gt:判断左边值是否大于右边值 4. >=或者gte:判断左边值是否大于等于右边值 5. <或者 ...

  5. 458. Poor Pigs

    There are 1000 buckets, one and only one of them contains poison, the rest are filled with water. Th ...

  6. 《自己动手写docker》之namespace部门实验

    动手写一遍,印象不一样! package main import ( "log" "os" "os/exec" "syscall& ...

  7. [BZOJ3150][Ctsc2013]猴子 期望dp+高斯消元

    3150: [Ctsc2013]猴子 Time Limit: 20 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 163  Solved: 10 ...

  8. day4 作业计算器

    作业:计算器开发 (1)实现加减乘除及拓号优先级解析: (2)用户输入 1 - 2 * ( (60-30 +(-40/5) * (-9-2*5/-3 + 7 /3*99/4*2998 +10 * 56 ...

  9. day4 使用yield实现单线程

    一.yield生成器(yield) yield用来结束while循环,并且能够保持之前循环的状态,下一次调用的时候直接从yield开始执行,执行yield后面的程序,并且重新进行循环:另外,yield ...

  10. js 正则验证多个邮箱,用;隔开的那种

    var r = /^((([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6}\;))*(([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\. ...