Redundant Paths 分离的路径

题目描述

为了从F(1≤F≤5000)个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们已经厌倦了被迫走某一条路,所以她们想建一些新路,使每一对草场之间都会至少有两条相互分离的路径,这样她们就有多一些选择.
每对草场之间已经有至少一条路径.给出所有R(F-1≤R≤10000)条双向路的描述,每条路连接了两个不同的草场,请计算最少的新建道路的数量,
路径由若干道路首尾相连而成.两条路径相互分离,是指两条路径没有一条重合的道路.但是,两条分离的路径上可以有一些相同的草场.
对于同一对草场之间,可能已经有两条不同的道路,你也可以在它们之间再建一条道路,作为另一条不同的道路.

输入格式

第1行输入F和R,接下来R行,每行输入两个整数,表示两个草场,它们之间有一条道路.

输出格式

最少的需要新建的道路数.

首先我们容易得出一个结论,环上任意两点都有两条分离路径

然后我们如果将这个图缩点后将会得到一个新图,(先缩点为敬)

我们需要添加路径使变成边双连通图,边双连通图上每一条边都一定在一个环内,我们让每两个叶子节点连边使它构成环就行了。

那么问题就变成了求叶子节点个数。

然后如果叶子数为奇数我们需要再将这个点与任意一个点相连。(叶子+1)/2就完了

如果为偶数直接就是(叶子)/2

#include<bits/stdc++.h>
#define ll long long
#define A 2000000
#define read(a) scanf("%lld",&a)
#define put(a) printf("%lld\n",a)
using namespace std;
map<pair<ll,ll>,bool> mp;
ll low[A],size[A],dfn[A],head[A],ver[A],nxt[A],cut[A],ans[A],sz[A];
ll ver2[A],nxt2[A],head2[A],out[A],belong[A],sta[A],ru[A],sb=0;
string s;
bool ins[A],flag[A],via[A];
vector<ll> scc[A];
ll n,m,num=0,root,top=0,tot=0,tot2=0,sum=0,cnt=0;
void add2(ll x,ll y){
ver2[++tot2]=y;nxt2[tot2]=head2[x];head2[x]=tot2;out[x]++;ru[y]++;return ;
}
void add(ll x,ll y){
ver[++tot]=y;nxt[tot]=head[x];head[x]=tot;return ;
}
inline void rebuilt(){
for(ll i=1;i<=n;i++){
for(ll j=head[i];j;j=nxt[j]){
ll y=ver[j];
if(y!=i)
if(belong[i]!=belong[y]/*&&*/)
add2(belong[i],belong[y])/*,,,printf("belong i=%lld,belong y=%lld\n",belong[i],belong[y])*/;
}
}
}
void tarjan(ll x,ll pre){
low[x]=dfn[x]=++num;
sta[++top]=x;ins[x]=1;
for(ll i=head[x];i;i=nxt[i]){
ll y=ver[i];
if(y==pre) continue;
if(!dfn[y]){
tarjan(y,x);
low[x]=min(low[x],low[y]);
}
else if(ins[y]){
low[x]=min(low[x],dfn[y]);
}
}
if(dfn[x]==low[x]){
++cnt;ll yy=0;
while(1){
yy=sta[top--];
ins[yy]=0;
belong[yy]=cnt;
sz[cnt]++;
scc[cnt].push_back(yy);
if(yy==x) break;
}
}
}
void shuchu()
{
for(ll i=1;i<=cnt;i++)
{
// printf("第%lld个scc size=%lld\n",i,sz[i]);
for(ll j=0;j<scc[i].size();j++)
{
cout<<scc[i][j]<<" ";
}
cout<<endl;
}
}
void dfs(ll x){
flag[x]=1;if(ru[x]==1) sb++;
for(ll i=head2[x];i;i=nxt2[i]){ ll y=ver2[i];// printf("x=%lld y=%lld outx=%lld\n",x,y,out[x]);
if(flag[y]) continue;
dfs(y);
}
}
int main(){
read(n);read(m);
for(ll i=1;i<=m;i++){
ll xx,yy;read(xx),read(yy);
if(!mp[make_pair(xx,yy)]&&!mp[make_pair(yy,xx)])
{
add(xx,yy);add(yy,xx);mp[make_pair(xx,yy)]=1,mp[make_pair(yy,xx)]=1;
}
}
for(ll i=1;i<=n;i++)
if(!dfn[i])root=i,tarjan(i,0);
rebuilt();
// shuchu();
for(ll i=1;i<=cnt;i++)
{
// printf("ru%lld=%lld\n",i,ru[i]);
if(ru[i]==1) sb++;
}
cout<<(sb+1)/2<<endl;
}

Redundant Paths 分离的路径的更多相关文章

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

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

  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 分离的路径 题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields ...

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

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

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

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

  7. C++边双缩点,Redundant Paths 分离的路径

    一道比较简单的 关于边双的题,个人感觉难度不大. 求出整个图的边双,根据边双的定义我们可以延伸出 边双的任两个点都有至少两种路径来互相抵达(因为其不存在割边) .不妨将每个边双缩成一个点,样例中的图便 ...

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

    Description 给出一个无向图,求将他构造成双连通图所需加的最少边数. Sol Tarjan求割边+缩点. 求出割边,然后缩点. 将双连通分量缩成一个点,然后重建图,建出来的就是一棵树,因为每 ...

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

    给你一个无向图,问至少加几条边可以使整个图变成一个双联通分量 简单图论练习= = 先缩点,ans = (度数为1的点的个数) / 2 这不是很好想的么QAQ 然后注意位运算的优先级啊魂淡!!!你个sb ...

随机推荐

  1. [源码解析] 并行分布式任务队列 Celery 之 负载均衡

    [源码解析] 并行分布式任务队列 Celery 之 负载均衡 目录 [源码解析] 并行分布式任务队列 Celery 之 负载均衡 0x00 摘要 0x01 负载均衡 1.1 哪几个 queue 1.1 ...

  2. 初识Vue2(一):表单输入绑定(附Demo)

    在线演示 http://demo.xiongze.net/ 下载地址 https://gitee.com/xiongze/Vue2.git js引用 <!--这里可以自己下载下来引用,也可以使用 ...

  3. [BUAA2021软工助教]结对项目-第二阶段小结

    一.作业链接 结对项目-第二阶段 二.优秀作业推荐 本次博客作业虽然是简单总结,但是以下作业中都不乏有思考.有亮点的精彩内容,推荐给同学们阅读学习. 磨练,结对编程!(中) zzx 和 zzy 同学实 ...

  4. 成功的多项目管理都有哪些"制胜之道"?

    实施多项目管理,一个重要原因就是提高项目的效率和管理水平.除了满足时间.成本.业绩和客户需求之外,项目管理办公室(PMO)经理的预期产出还包括有效利用组织资源.下面是影响多项目管理成功的几个关键因素, ...

  5. [MySQL数据库之Navicat.pymysql模块、视图、触发器、存储过程、函数、流程控制]

    [MySQL数据库之Navicat.pymysql模块.视图.触发器.存储过程.函数.流程控制] Navicat Navicat是一套快速.可靠并价格相当便宜的数据库管理工具,专为简化数据库的管理及降 ...

  6. C#·对于BOM头之完全解决方案

    阅文时长 | 0.46分钟 字数统计 | 798.4字符 主要内容 | 1.引言&背景 2.使用C#写入带有/不带有BOM头的文件? 3.对于读取文件时,避免BOM头造成的异常. 4.声明与参 ...

  7. [bug] redis-cli连接时出现Could not connect to Redis at 127.0.0.1:6379: Connection refused

    参考 https://www.geek-share.com/detail/2684728161.html

  8. [云计算] OpenStack 发展史

    传统数据中心面临的问题 无法管理,资源利用率不高 资源分配不合理 初始成本高 发展阶段 IDC 托管/租用 VPS(虚拟专用主机/OpenVZ/XEN) 虚拟主机 云主机 虚拟化 服务器虚拟化 KVM ...

  9. MySQL8 配置远程连接

    引言 MySQL8 默认安装后只有本机能访问,如果需要远程连接 MySQL 将无法访问 查看 root 用户权限 进入 mysql 表 select user,host,plugin from use ...

  10. exit()和_exit()的区别

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/HAHAandHEHE/article/de ...