[BZOJ1718]:[Usaco2006 Jan] Redundant Paths 分离的路径(塔尖)
题目传送门
题目描述
  为了从F个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们已经厌倦了被迫走某一条路,所以她们想建一些新路,使每一对草场之间都会至少有两条相互分离的路径,这样她们就有多一些选择。
  每对草场之间已经有至少一条路径.给出所有R条双向路的描述,每条路连接了两个不同的草场,请计算最少的新建道路的数量, 路径由若干道路首尾相连而成.两条路径相互分离,是指两条路径没有一条重合的道路.但是,两条分离的路径上可以有一些相同的草场. 对于同一对草场之间,可能已经有两条不同的道路,你也可以在它们之间再建一条道路,作为另一条不同的道路。
输入格式
第1行输入F和R,接下来R行,每行输入两个整数,表示两个草场,它们之间有一条道路。
输出格式
最少的需要新建的道路数。
样例
样例输入:
7 7
1 2
2 3
3 4
2 5
4 5
5 6
5 7
样例输出:
2
数据范围与提示

图中实线表示已有的道路,虚线表示新建的两条道路。
现在可以检验一些路径,比如:
草场1和草场2:1→2和1→6→5→2。
草场1和草场4:1→2→3→4和1→6→5→4。
草场3和草场7:3→4→7和3→2→5→7。
事实上,每一对草场之间都连接了两条分离的路径。
1≤F≤5000,F-1≤R≤10000。
注意会有重边!!!
题解
看到这道题,马上想到了塔尖,缩e-DCC。
然后答案即为得到的$\frac{这棵树上的叶子节点的个数+1}{2}$,利用性质,连边为1的点即为叶子节点,统计答案即可。
代码细节较多,建议尝试自己根据自己的理解手打。
当然也有大神缩v-DCC,直接A掉。
还有这么一种解法,塔尖之后不用重新建图,而是直接判断在一条边两端的点low的值是否相同,如果不同那么就让度数+1。(他们的塔尖通过在一开始直接判断e.to是否等于father,如果相等直接continue)。
但是这样并不正确!!!
考虑这道题会有重边,所以如果low[x]≠low[y],但是它们还可能属于一个强联通分量。
不过如果你使用了可以规避重边的方法,那么就没有问题。
综上所述,板子要理解,并能灵活运用!!!
代码时刻
e-DCC
#include<bits/stdc++.h>
using namespace std;
struct rec
{
int from;
int nxt;
int to;
}e[200010],wzc[200010];
int head[5010],cnt=1;
int headw[5010],cntw=1;
int F,R;
int dfn[5010],low[5010],tot;
bool bridge[200010];
int c[5010],dcc;
int ans[5010];
int sum;
bool vis[5010];
void add(int x,int y)
{
e[++cnt].nxt=head[x];
e[cnt].from=x;
e[cnt].to=y;
head[x]=cnt;
}
void tarjan(int x,int in_edge)//判断桥
{
dfn[x]=low[x]=++tot;
for(int i=head[x];i;i=e[i].nxt)
{
if(!dfn[e[i].to])
{
tarjan(e[i].to,i);
low[x]=min(low[x],low[e[i].to]);
if(dfn[x]<low[e[i].to])
bridge[i]=bridge[i^1]=1;
}
else if(i!=(in_edge^1))
low[x]=min(low[x],dfn[e[i].to]);
}
}
void dfs(int x)//求e-DCC
{
c[x]=dcc;
for(int i=head[x];i;i=e[i].nxt)
{
if(c[e[i].to]||bridge[i])continue;
dfs(e[i].to);
}
}
int main()
{
scanf("%d%d",&F,&R);
for(int i=1;i<=R;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
for(int i=1;i<=F;i++)
if(!dfn[i])tarjan(i,0);
for(int i=1;i<=F;i++)
if(!c[i])
{
++dcc;
dfs(i);
}
for(int i=2;i<=cnt;i++)//开始计算答案
if(c[e[i].from]!=c[e[i].to])ans[c[e[i].from]]++;
for(int i=1;i<=dcc;i++)
if(ans[i]==1)sum++;
printf("%d",(sum+1)/2);
return 0;
}
v-DCC
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int const maxn=5010;
struct node{int st,to,nxt;}l[4*maxn];
vector<int>v[maxn];
int n,m,head[maxn],tot,num,in[maxn*2],ans;
int dfn[maxn],low[maxn],stack[maxn],bl[maxn*2],id[maxn*2],cut[maxn*2],top,now,cnt,rt;
void add1(int x,int y)
{
l[++tot].to=y;
l[tot].st=x;
l[tot].nxt=head[x];
head[x]=tot;
}
void tarjan(int x)//割点
{
dfn[x]=low[x]=++now,stack[++top]=x;
if(x==rt&&head[x]==0)
{
v[++cnt].push_back(x);
bl[x]=cnt;
return ;
}
int flag=0;
for(int i=head[x];i;i=l[i].nxt)
{
int y=l[i].to;
if(!dfn[y])
{
tarjan(y);
low[x]=min(low[x],low[y]);
if(low[y]>=dfn[x])
{
flag++;
if(x!=rt||flag>1) cut[x]=1;
cnt++;int z;
do{
z=stack[top--];
v[cnt].push_back(z);
bl[z]=cnt;
}while(y!=z);
v[cnt].push_back(x);
}
}
else low[x]=min(low[x],dfn[y]);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1,x,y;i<=m;i++)
{
scanf("%d%d",&x,&y);
add1(x,y),add1(y,x);
}
for(int i=1;i<=n;i++) if(!dfn[i]) rt=i,tarjan(i);
num=cnt;
for(int i=1;i<=n;i++) if(cut[i]) id[i]=++num;
for(int i=1;i<=cnt;i++)
for(int j=0;j<v[i].size();j++)
if(cut[v[i][j]]) in[i]++;
for(int i=1;i<=cnt;i++) if(in[i]==1) ans++;
printf("%d",(ans+1)/2);
return 0;
}
rp++
[BZOJ1718]:[Usaco2006 Jan] Redundant Paths 分离的路径(塔尖)的更多相关文章
- BZOJ1718 [Usaco2006 Jan] Redundant Paths 分离的路径
		
给你一个无向图,问至少加几条边可以使整个图变成一个双联通分量 简单图论练习= = 先缩点,ans = (度数为1的点的个数) / 2 这不是很好想的么QAQ 然后注意位运算的优先级啊魂淡!!!你个sb ...
 - BZOJ1718: [Usaco2006 Jan] Redundant Paths 分离的路径【边双模板】【傻逼题】
		
LINK 经典傻逼套路 就是把所有边双缩点之后叶子节点的个数 //Author: dream_maker #include<bits/stdc++.h> using namespace s ...
 - BZOJ 1718: [Usaco2006 Jan] Redundant Paths 分离的路径( tarjan )
		
tarjan求边双连通分量, 然后就是一棵树了, 可以各种乱搞... ----------------------------------------------------------------- ...
 - [Usaco2006 Jan] Redundant Paths 分离的路径
		
1718: [Usaco2006 Jan] Redundant Paths 分离的路径 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1132 Solv ...
 - BZOJ 1718: [Usaco2006 Jan] Redundant Paths 分离的路径
		
Description 给出一个无向图,求将他构造成双连通图所需加的最少边数. Sol Tarjan求割边+缩点. 求出割边,然后缩点. 将双连通分量缩成一个点,然后重建图,建出来的就是一棵树,因为每 ...
 - 【BZOJ】1718: [Usaco2006 Jan] Redundant Paths 分离的路径
		
[题意]给定无向连通图,要求添加最少的边使全图变成边双连通分量. [算法]Tarjan缩点 [题解]首先边双缩点,得到一棵树(无向无环图). 入度为1的点就是叶子,两个LCA为根的叶子间合并最高效,直 ...
 - bzoj 1718: [Usaco2006 Jan] Redundant Paths 分离的路径【tarjan】
		
首先来分析一下,这是一张无向图,要求没有两条路联通的点对个数 有两条路连通,无向图,也就是说,问题转化为不在一个点双连通分量里的点对个数 tarjan即可,和求scc还不太一样-- #include& ...
 - 【bzoj1718】Redundant Paths 分离的路径
		
1718: [Usaco2006 Jan] Redundant Paths 分离的路径 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 964 Solve ...
 - Redundant Paths 分离的路径【边双连通分量】
		
Redundant Paths 分离的路径 题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields ...
 
随机推荐
- Gantt与PERT图区别
			
甘特图也就做进度管理图.他是一种简单的水平条形图,它以日历为基准描述项目任务,水平轴表示日历时间线,每一个线条表示一个任务,任务名称垂直的列在左边列中,图中的线条的起点和终点对应水平轴上的时间,分别表 ...
 - maven配置生成可执行的jar:maven-shade-plugin
			
默认打包生成的jar是不能直接运行的,因为带有main方法的信息不会添加到mainifest中,需要借助maven-shade-plugin <project> ... <build ...
 - 使用procedump捕获未处理异常的dump
			
-ma full memory dump, always do this on 2003 as 4gb is not much and it is good to have the heap -mp ...
 - jqery实现10X10的表格,双击消失
			
<script type="text/javascript"> $(document).ready(function(){ //循环拼接html s="&qu ...
 - 【vue】iView-admin2.0动态菜单路由【版2】
			
依照iView-admin2.0动态菜单路由[版1] 归纳几个节点动态路由获取方式2 ——> easymock假数据 ——> 数据转组件处理.addRoutes ——> localS ...
 - ansible 的file 模块
			
创建.修改.删除文件或者目录: file模块 file模块常用的几个参数:state.path.src.dest.mode.owner.group.name.recurse state后面跟的参数: ...
 - Educational Codeforces Round 42 (Rated for Div. 2) E. Byteland, Berland and Disputed Cities(贪心)
			
E. Byteland, Berland and Disputed Cities time limit per test2 seconds memory limit per test256 megab ...
 - 【学习】027 Dubbo
			
Dubbo概述 Dubbo的背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 ...
 - Noip2018退役记。
			
下面是边考试边写的严肃版退役记\(:D\) Day0 其实我本来想取个这个名字:\(NOIP2018\)提高组复赛试题解析 但是这个博客自己求生欲望太强自己改名了. 先占个坑. noip考前毒奶 \( ...
 - hive中的null
			
在处理流水增量表的时候,出现了一个判定的失误. select a.a1,a.a2 from ( select a.a1 ,,) as diff ,a.a2 from a lefter join b o ...