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

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



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

我们发现只要 将所有的叶子节点(度为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. JSP页面包含其他页面的三种方式及区别

    一. <%@ include file="header.inc"%> 该指令在编译之前先读入指定的页面中的内容(并不对动态内容求值),融合后的完整页面再被整体的转换为一 ...

  2. window下lamp环境搭建

    软件: apache_2.2.25.msi php-5.4.30-Win32-VC9-x86.zip mysql-5.6.11-win32.msi下载地址:http://download.csdn.n ...

  3. PAT Advanced 1077 Kuchiguse (20 分)

    The Japanese language is notorious for its sentence ending particles. Personal preference of such pa ...

  4. [转]走近0day

    首先,需要大家端正一下学习态度-也就是对于破解的态度.每一个有一定修为的软件破解者,也就是CRACKER,都很清楚,我们破解掉软件的序列号,功能限制,时间限制等等东西都不是最终的目的,一个真正的CRA ...

  5. Netty学习--第二章 BIO的模型详解

    一.什么是阻塞.非阻塞.同步.异步 我们以A线程调用B线程的过程例子来讲解这四个概念 在一个程序里,A调用B了,此时如果是 同步: A必须等待B返回结果后,才能继续执行,但是在这期间A会一直监控B的返 ...

  6. JDK7

    https://docs.oracle.com/javase/7/docs/index.html

  7. 运行biggan demo

    http://www.zhuanzhi.ai/document/8705953a704e1bf8e051c161d1587d88

  8. 无法启动链接服务器"XXX DB Link"的 OLE DB 访问接口 "SQLNCLI11" 的嵌套事务。由于 XACT_ABORT 选项已设置为 OFF,因此必须使用嵌套事务。链接服务器"XXX DB Link"的 OLE DB 访问接口 "SQLNCLI11" 返回了消息"无法在此会话中启动更多的事务"。

    无法启动链接服务器"XXX DB Link"的 OLE DB 访问接口 "SQLNCLI11" 的嵌套事务.由于 XACT_ABORT 选项已设置为 OFF,因 ...

  9. IDEA提交代码到github

    GIT客户端安装及idea配置github账号并提交代码到GIT参考资料:https://blog.csdn.net/qq_31405633/article/details/88193119 1. 选 ...

  10. mysql Update语句 语法

    mysql Update语句 语法 作用:用于修改表中的数据.广州大理石机械构件 语法:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 mysql Update语句 示例 ...