LOJ10098
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的更多相关文章
- loj10098 分离的路径
传送门 分析 此题要先用tarjan求点双联通分量,注意在求解是要注意一条无向边只能走一次.求完之后我们发现原来的图会变成一棵树,对于 这棵树我们发现答案是(叶子节点数量+1)/2,实际便是每两个节点 ...
随机推荐
- 远程调用get和post请求 将返回结果转换成实体类
package org.springblade.desk.utils; import org.apache.http.client.ResponseHandler; import org.apache ...
- flowable 实现多实例-会签-动态配置人员 参考demo
会签 即多人执行当前任务 设置判断数 通过 例如:设置了是半数通过即可通过当前节点 如果当前是4人那就是2人即通过 如果是6人那就是三人即通过 如果是5人 即三人通过 看各位的判断值是如何书写 这个值 ...
- spring mvc与mybatis事务整合
之前公司用的是mybatis,但事务管理这块是用ejb的CMT容器管理的事务.基本原理是ejb请求进来,业务代码会创建一个mybatis的session然后放入当前线程,之后所有的方法操作涉及到数据库 ...
- JTable写入数据库内容
/*JTable中导入数据库数据. 创建2个Vector col和dat col存入字段名 dat存入数据内容. dbname=new JTable(dat,col); */package demo; ...
- 【linux】系统编程-5-线程
目录 前言 7. 线程 7.1 概念 7.2 创建线程 7.2.1 pthread_create() 7.3 设置线程属性 7.3.1 pthread_attr_init() 7.3.2 销毁一个线程 ...
- Apache的Mod_rewrite学习(RewriteRule重写规则的语法) 转
RewriteRuleSyntax: RewriteRule Pattern Substitution [flags] 一条RewriteRule指令,定义一条重写规则,规则间的顺序非常重要.对Apa ...
- Apache伪静态(Rewrite).htaccess文件详解
Htaccess(超文本访问)是一个简单的配置文件,它允许设计师,开发者和程序员通过它来改变Apache Web服务器的配置.这些功能包括用户重定向.URL重写(url rewrite,国内很多称为伪 ...
- springboot集成轻量级权限认证框架sa-token
sa-token是什么? sa-token是一个JavaWeb轻量级权限认证框架,主要解决项目中登录认证.权限认证.Session会话等一系列由此衍生的权限相关业务.相比于其他安全性框架较容易上手. ...
- 微信小程序API交互的自定义封装
目录 1,起因 2,优化成果 3,实现思路 4,完整代码 1,起因 哪天,正在蚂蚁森林疯狂偷能量的我被boss叫过去,告知我司要做一个线上直播公开课功能的微信小程序,博主第一次写小程序,复习了下文档, ...
- 大文件上传FTP
需求 将本地大文件通过浏览器上传到FTP服务器. 原有方法 将本地文件整个上传到浏览器,然后发送到node服务器,最后由node发送到FTP服务器. 存在问题 浏览器缓存有限且上传速率受网速影响,当文 ...