博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
luogu P2860 [USACO06JAN]冗余路径Redundant Paths
阅读量:6197 次
发布时间:2019-06-21

本文共 3213 字,大约阅读时间需要 10 分钟。

题目描述

In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1…F) to another field, Bessie and the rest of the herd are forced to cross near the Tree of Rotten Apples. The cows are now tired of often being forced to take a particular path and want to build some new paths so that they will always have a choice of at least two separate routes between any pair of fields. They currently have at least one route between each pair of fields and want to have at least two. Of course, they can only travel on Official Paths when they move from one field to another.

Given a description of the current set of R (F-1 <= R <= 10,000) paths that each connect exactly two different fields, determine the minimum number of new paths (each of which connects exactly two fields) that must be built so that there are at least two separate routes between any pair of fields. Routes are considered separate if they use none of the same paths, even if they visit the same intermediate field along the way.

There might already be more than one paths between the same pair of fields, and you may also build a new path that connects the same fields as some other path.

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

每对草场之间已经有至少一条路径.给出所有R(F-1≤R≤10000)条双向路的描述,每条路连接了两个不同的草场,请计算最少的新建道路的数量, 路径由若干道路首尾相连而成.两条路径相互分离,是指两条路径没有一条重合的道路.但是,两条分离的路径上可以有一些相同的草场. 对于同一对草场之间,可能已经有两条不同的道路,你也可以在它们之间再建一条道路,作为另一条不同的道路.

输入输出格式

输入格式:
Line 1: Two space-separated integers: F and R

Lines 2…R+1: Each line contains two space-separated integers which are the fields at the endpoints of some path.

输出格式:

Line 1: A single integer that is the number of new paths that must be built.

输入输出样例

输入样例#1:
7 7
1 2
2 3
3 4
2 5
4 5
5 6
5 7

输出样例#1:

2

bcc的模板题。用tarjan缩边双联通分量,然后就可以建出bcc树,答案就是(bcc树上的叶子节点个数+1)2\frac{(bcc树上的叶子节点个数+1)}{2}2bcc+1。因为我们要将肯定将叶子节点两两链接起来最优。

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long#define N 5005#define M 100005using namespace std;inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}int n,m;int low[N],dfn[N],id;struct load { int to,next;}s[M<<1];int h[N],cnt=1;void add(int i,int j) {s[++cnt]=(load) {j,h[i]};h[i]=cnt;}int st[N],top;int bcc;int bel[N];void tarjan(int v,int fr) { dfn[v]=low[v]=++id; st[++top]=v; for(int i=h[v];i;i=s[i].next) { if((i^1)==fr) continue ; int to=s[i].to; if(!dfn[to]) { tarjan(to,i); low[v]=min(low[v],low[to]); } else low[v]=min(low[v],dfn[to]); } if(low[v]==dfn[v]) { bcc++; while(1) { int j=st[top--]; bel[j]=bcc; if(j==v) break; } }}int r[N];int main() { n=Get(),m=Get(); int a,b; for(int i=1;i<=m;i++) { a=Get(),b=Get(); add(a,b),add(b,a); } tarjan(1,0); for(int v=1;v<=n;v++) { for(int i=h[v];i;i=s[i].next) { int to=s[i].to; if(bel[v]!=bel[to]) r[bel[to]]++; } } int ans=0; for(int i=1;i<=bcc;i++) if(r[i]==1) ans++; cout<<(ans+1)/2; return 0;}

转载于:https://www.cnblogs.com/hchhch233/p/9996739.html

你可能感兴趣的文章
arm linux串口蓝牙工具移植及使用【转】
查看>>
牛客网Java刷题知识点之垃圾回收算法过程、哪些内存需要回收、被标记需要清除对象的自我救赎、对象将根据存活的时间被分为:年轻代、年老代(Old Generation)、永久代、垃圾回收器的分类...
查看>>
解决Spring框架的Dao层改用@Repository注解,无法使用JdbcDaoSupport的问题
查看>>
$.cookie is not a function;原因及解决办法
查看>>
HTML5 Canvas,WebGL,CSS Shaders,GLSL的暧昧关系 【转】
查看>>
HashMap的实现原理
查看>>
ubuntu 16.04上安装php5.6
查看>>
Redash 安装部署
查看>>
【Python】CentOs7 Python3安装Openssl以及解决ssl问题
查看>>
PHP从数组中删除元素的四种方法实例
查看>>
卡尔曼滤波
查看>>
java中volatile关键字的理解
查看>>
android studio插件【转】
查看>>
『原创』老范的来电防火墙v1.0发布了(图文)
查看>>
用Asp.net写自己的服务框架
查看>>
[转]Windows Server 2012体验之部署第一台域控制器
查看>>
【转载】来自Clean Code的一段话,正好形容公司目前一个系统
查看>>
C#重载和重写的区别
查看>>
【089】◀▶ Microsoft Office 技巧
查看>>
【转】自定义UITableViewCell控件阻挡回调不到didSelectRowAtIndexPath的解决办法
查看>>