USACO 2006 Jan. Gold

为了从F个草场中的一个走到另一个,贝茜和她的同伴们不得不路过一些她们讨厌的可怕的树。奶牛们已经厌倦了被迫走某一条路,所以她们想建一些新路,使每一对草场之间都会至少有两条相互分离的路径,这样她们就有多一些选择。

每对草场之间已经有至少一条路径,给出所有R条双向路的描述,每条路连接了两个不同的草场,请计算最少的新建道路的数量。

路径由若干道路首尾相连而成,两条路径相互分离,是指两条路径没有一条重合的道路,但是两条分离的路径上可以有一些相同的草场。

对于同一对草场之间,可能已经有两条不同的道路,你也可以在它们之间再建一条道路,作为另一条不同的道路。

输入格式

第一行输入两个整数F和R;

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

输出格式

输出最少需要新建的道路数目。

样例

样例输入

7 7
1 2
2 3
3 4
2 5
4 5
5 6
5 7

样例输出

2

数据范围与提示

F<=5000,R<=10000

______________________________________________________________

tarjan算法求双联通分量,实际上和求强联通分量是一样的,只要把双向边的反边标记为不可用就可以了。

求出双联通分量,重新建图,统计每个分量的度,叶子节点相互连接就可以了,所以答案就是(叶子数+1)/2

______________________________________________________________

 1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=5e3+10;
4 const int maxm=2e4+10;
5 int n,m;
6 struct edge
7 {
8 int u,v,nxt;
9 bool pd;
10 }e[maxm];
11 int head[maxn],js;
12 void addage(int u,int v)
13 {
14 e[++js].u=u;e[js].v=v;
15 e[js].nxt=head[u];head[u]=js;
16 }
17 int low[maxn],dfn[maxn],cnt,st[maxn],top,lt[maxn],lts;
18 void tarjan(int u)
19 {
20 low[u]=dfn[u]=++cnt;
21 st[++top]=u;
22 for(int i=head[u];i;i=e[i].nxt)
23 if(e[i].pd==0)
24 {
25 e[(i&1)?i+1:i-1].pd=1;
26 int v=e[i].v;
27 if(!dfn[v])
28 {
29 tarjan(v);
30 low[u]=min(low[u],low[v]);
31 }
32 else low[u]=min(low[u],dfn[v]);
33
34 }
35 if(low[u]==dfn[u])
36 {
37 lt[u]=++lts;
38 while(st[top]!=u)lt[st[top--]]=lts;
39 --top;
40 }
41 }
42 int du[maxn];
43 int main()
44 {
45 scanf("%d%d",&n,&m);
46 for(int u,v,i=1;i<=m;++i)
47 {
48 scanf("%d%d",&u,&v);
49 addage(u,v);addage(v,u);
50 }
51 tarjan(1);
52 for(int u=1;u<=n;++u)
53 for(int i=head[u];i;i=e[i].nxt)
54 {
55 int v=e[i].v;
56 if(lt[u]!=lt[v])
57 {
58 du[lt[u]]++;
59 du[lt[v]]++;
60 }
61 }
62 int ans=0;
63 for(int i=1;i<=lts;++i)
64 if(du[i]==2)ans++;
65 cout<<((ans+1)>>1)<<endl;
66 return 0;
67 }
 

LOJ10098的更多相关文章

  1. loj10098 分离的路径

    传送门 分析 此题要先用tarjan求点双联通分量,注意在求解是要注意一条无向边只能走一次.求完之后我们发现原来的图会变成一棵树,对于 这棵树我们发现答案是(叶子节点数量+1)/2,实际便是每两个节点 ...

随机推荐

  1. list转long[]数组

    //list转long数组List<Long> list = new ArrayList<>(); Long[] skuIds = list.toArray(new Long[ ...

  2. mysql免安装教程

    1. 下载MySQL Community Server 5.6.13 2. 解压MySQL压缩包    将以下载的MySQL压缩包解压到自定义目录下,我的解压目录是:    "D:\Prog ...

  3. 手摸手带你用Hexo撸博客(一)

    原文地址 手摸手带你用Hexo撸博客(一) 环境搭建 安装 node 狂点下一步 命令行输入此条命令 如果能看到版本号则安装成功 node -v 安装Git (同上) 实在不会的小伙伴百度一下,教程很 ...

  4. [leetcode]TwoSum系列问题

    1.普通数组找两个数,哈希表建立数值和下标的映射,遍历时一边判断一边添加 /* 哇,LeetCode的第一题...啧啧 */ public int [] twoSum(int[] nums, int ...

  5. 学习 Gin 总结(2020.12.30-31)

    2020.12.30 问题总结 中间件 context.Next() 源码注释: // Next should be used only inside middleware. // It execut ...

  6. Java入门随手记-DOS命令

    DOS 打开cmd的方式 开始+系统+命令提示符 win键+r 输入cmd打开控制台(推荐使用) 在任意的文件夹下面,按住shift键+鼠标右键点击,在此次打开命令窗口 资源管理器的地址栏前面加上cm ...

  7. CentOS8_在线安装_网络源_网络镜像源填写格式_以及其他笔记

    CentOS8_在线安装_网络源_网络镜像源填写格式_以及其他笔记 转载注明来源: 本文链接 来自osnosn的博客,写于 2020-10-1. 参考: Centos8.0.1905 在线安装源选择 ...

  8. 解决 unknown filesystem type ntfs U盘/移动硬盘挂载出错问题

    大内存U盘或者移动硬盘挂在再Linux 时,报错unknown filesystem type ntfs 1.安装ntfs-3g wget http://tuxera.com/opensource/n ...

  9. git的基础知识

    git 分布式版本控制工具 具备的功能 协同开发 多人并行不悖修改服务器端的同一个文件 数据备份 不仅保持目录和文件当前状态,还能保存每一个提交的历史版本 版本管理 保存每一个版本的文件信息的时候做到 ...

  10. Java基础-数据类型及变量

    Java基本语法 1.标识符(zhi) 含义:名字 类名.对象名.方法名.变量名.常量名-- 一个合法的标识符的组成:数字.字母._和$ 注意事项: 不能重复 不能以数字开头 区分大小写 不能以关键字 ...