一道比较简单的 关于边双的题,个人感觉难度不大。

求出整个图的边双,根据边双的定义我们可以延伸出 边双的任两个点都有至少两种路径来互相抵达(因为其不存在割边) 。不妨将每个边双缩成一个点,样例中的图便变成了一棵树:



为什么呢?因为缩了点之后的图如果存在环,这个环便又可以构成一个边双了。

我们发现只要 将所有的叶子节点(度为1)的节点连起来,整个图便就构成了一个边双。那么我们的做法就很明确了,选取一个度不为1的点作为根,统计度为1的节点的数量n,答案便是(n+1)/2.

#include <iostream>
#include <vector>
#include <stack>
#include <cstring>
#include <cstdio>
using namespace std; #define N 5010
#define M 10010
#define LL long long struct node {
int to,no;
node () {};
node (int T,int No) {
to=T;no=No;
}
}; LL flag,ans,value[M],n,m,num,cntn,DFN[N],IsCut[M],low[N];
vector <node> G[N]; LL read() {
LL f=1,s=0;char a=getchar();
while(!(a>='0'&&a<='9')) { if(a=='-') f=-1 ; a=getchar(); }
while(a>='0'&&a<='9') { s=s*10+a-'0'; a=getchar();}
return f*s;
} int min(int a,int b) {
if(a<b) return a;
return b;
} void Tarjan(LL u,LL fano) {
DFN[u]=low[u]=++num;
for(LL i=0;i<G[u].size();i++) {
LL v=G[u][i].to,vno=G[u][i].no;
if(!DFN[v]) {
Tarjan(v,vno);
if(low[v]>DFN[u]) {
IsCut[vno]=1;
cntn++;
}
low[u]=min(low[u],low[v]);
}
else if(DFN[u]>DFN[v] && vno!=fano)
low[u]=min(low[u],DFN[v]);
}
} bool vis[N];
int belong[M],rel[N],cntno,cnt=1; void init() {
memset(low,0,sizeof(low));
memset(DFN,0,sizeof(DFN));
memset(IsCut,0,sizeof(IsCut));
memset(vis,0,sizeof(vis));
cin>>n>>m;
for(int i=1;i<=n;i++)
G[i].clear();
cntno=cntn=0;
for(int i=1,u,v,w;i<=m;i++) {
u=read();v=read();
G[u].push_back( node (v,cnt) );
G[v].push_back( node (u,cnt++) );
} } int dfs(int u) {
belong[u]=cntno;
for(int i=0,v,vno;i<G[u].size();i++) {
v=G[u][i].to,vno=G[u][i].no;
if(!IsCut[vno] && !belong[v])
dfs(v);
}
} bool book[N][N]; int main() {
init();
Tarjan(1,-1);
for(int i=1;i<=n;i++)
if(!belong[i]) {
cntno++;
dfs(i);
} //cout<<cntno<<endl;
for(int i=1;i<=n;i++)
for(int j=0;j<G[i].size();j++) {
int x=belong[i],y=belong[G[i][j].to];
if(x!=y ) {
rel[x]++; //rel统计边双的度
}
}
for(int i=1;i<=n;i++)
if(rel[i]==1)
ans++;
cout<<(ans+1)/2<<endl;
}

C++边双缩点,Redundant Paths 分离的路径的更多相关文章

  1. Redundant Paths 分离的路径【边双连通分量】

    Redundant Paths 分离的路径 题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields ...

  2. 【bzoj1718】Redundant Paths 分离的路径

    1718: [Usaco2006 Jan] Redundant Paths 分离的路径 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 964  Solve ...

  3. [Usaco2006 Jan] Redundant Paths 分离的路径

    1718: [Usaco2006 Jan] Redundant Paths 分离的路径 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1132  Solv ...

  4. Redundant Paths 分离的路径

    Redundant Paths 分离的路径 题目描述 为了从F(1≤F≤5000)个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们已经厌倦了被迫走某一条路,所以她 ...

  5. BZOJ 1718: [Usaco2006 Jan] Redundant Paths 分离的路径( tarjan )

    tarjan求边双连通分量, 然后就是一棵树了, 可以各种乱搞... ----------------------------------------------------------------- ...

  6. BZOJ1718:[USACO]Redundant Paths 分离的路径(双连通分量)

    Description In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numb ...

  7. BZOJ1718: [Usaco2006 Jan] Redundant Paths 分离的路径【边双模板】【傻逼题】

    LINK 经典傻逼套路 就是把所有边双缩点之后叶子节点的个数 //Author: dream_maker #include<bits/stdc++.h> using namespace s ...

  8. 【BZOJ】1718: [Usaco2006 Jan] Redundant Paths 分离的路径

    [题意]给定无向连通图,要求添加最少的边使全图变成边双连通分量. [算法]Tarjan缩点 [题解]首先边双缩点,得到一棵树(无向无环图). 入度为1的点就是叶子,两个LCA为根的叶子间合并最高效,直 ...

  9. [BZOJ1718]:[Usaco2006 Jan] Redundant Paths 分离的路径(塔尖)

    题目传送门 题目描述 为了从F个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们已经厌倦了被迫走某一条路,所以她们想建一些新路,使每一对草场之间都会至少有两条相互分 ...

随机推荐

  1. Apache 配置外网站点

    基于域名,一般是对外网站 www.etiantian.org/var/www/html/www blog.etiantian.org /var/www/html/blog bbs.tiantian.o ...

  2. MySQL 5.7原生通用二进制格式安装包安装过程

    目录 官方文档 文件说明 官方文档 https://dev.mysql.com/doc/refman/5.7/en/binary-installation.html 文件说明 Directory Co ...

  3. python二维码模块(qrcode)

    qrcode模块安装 运行命令行工具(cmd),使用pip安装工具分别安装qrcode. pip install qrcode 先来个简单的例子 import qrcode # 二维码内容 data ...

  4. 008-流程控制 case 语句

    流程控制 case 语句 与if...elif...else 语句一样都是多分支条件语句,不过if语句可以判断多种条件关系,case只能判断一种条件关系 [root@zabbix lianxi]# . ...

  5. PAT Advanced 1011 World Cup Betting (20 分)

    With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excite ...

  6. 2019 蓝桥杯国赛 B 组模拟赛 D. 程序设计:公约数

    蒜头君有n个数,他想要从中选出k个数,使得它们的最大公约数最大.请你求出这个最大的最大公约数. 输入格式第一行输入两个整数 .第二行输入 个整数 . 输出格式输出一个整数. 数据范围 样例输入14 3 ...

  7. Django【第12篇】:Django之中间件

    自定义验证规则以及中间件简单介绍 1.python2和python3中的区别 对于python2内置的字符串类型有str和unicode 比如:"abc"是字符串,u"你 ...

  8. Pool数据池

    sql相关请点我!!! 1.普通的sql语句查询完成之后,就要断开,下次查的时候又要重新开启,这样的话,效率会很低,所以利用pool 数据池来解决这种问题,pool数据池查询完之后,就不用去重新链接数 ...

  9. NOIP2017 D1T1 小凯的疑惑

    洛谷P3951 看到题目,很容易想到这一题是求使ax+by=c(a,b,c∈N)无非负整数解的最大c 由裴蜀定理可知方程一定有整数解(a,b互素,gcd(a,b)=1|c) 解法一:暴力枚举 看到题目 ...

  10. Web应用防火墙云WAF详细介绍

    Web应用防火墙,或叫Web应用防护系统(也称为:网站应用级入侵防御系统.英文:Web Application Firewall,简称: WAF).利用国际上公认的一种说法:Web应用防火墙是通过执行 ...