UESTC_方老师和农场 2015 UESTC Training for Graph Theory<Problem L>
L - 方老师和农场
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
方老师重新开了一家农场,农场一共有N个节点和M条双向边,但是有一个很大的问题就是有比如一个农场A到达农场B只有一条路径,问至少添加多少条边使得任意两个农场之间的路径多于一条。
Input
- 多组数据,
EOF结束。 - 第1行:N和M。
- 第2到第M+1行:每一行2个数Ui和Vi,表示Ui到Vi之间有一条边。
Output
一行一个数表示至少需要添加多少条边。
Sample input and output
| Sample Input | Sample Output |
|---|---|
7 7 |
2 |
Hint
N≤100000,M≤100000
解题思路:
我们先考虑原图连通的情况
首先跑一遍图,求出所有的桥,之后跑出边双连通分量数目.
将边双连通分量看成一个点.
之后我们考虑整个图,必然成了一棵树.
证明:
假设将边双连通分量看成一个点后图不是树,必然存在两个儿子之间连有边,这样就构成了边双连通,显然不合法,故命题正确.

<B,C>之间不可能有边,否则构成了边双连通.
之后我们将问题转换为了树上至少连多少条边,使得树上任意两点的路径条数多于两条?
这样问题就很容易解了.
设树上的叶子有 N 个
If N ∈ (2 * k ) , ans = N / 2;
Else ans = ( N + 1 ) / 2
综合下得 ans = (N + 1 ) / 2;
为什么这样是对的呢?,我们将树上非叶的结点看成一个大圆圈,之后叶子,两两配对(找不到就自己和自己配),配对的顺序是第 x 个,和第 n – x + 1个,如图:

之后我们考虑,若原图不连通,如何求解?
还是看成大圆圈加几个根,把所有的叶子数加起来当成 N 就可以了.
这里有点要注意,我们给一旦连了一条边,其实我们就等于给大圆圈连了一条边了
<夜深了,就不证明了>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <set>
#define pb push_back //#define localtest using namespace std;
const int maxn = 1e5 + ;
int n,m,new_time[maxn],low[maxn],T,tot,degree[maxn],number[maxn];
bool use[maxn]; typedef pair<int,int> Etype;
set<Etype>spj; typedef struct Edge
{
int v,isbridge;
Edge(const int &v)
{
this->v = v;
isbridge = ;
}
}; vector<Edge>E[maxn]; int tarjan_dfs(int cur,int pre)
{
new_time[cur] = low[cur] = T++;
for(int i = ; i < E[cur].size() ; ++ i)
{
int nextnode = E[cur][i].v;
if (!new_time[nextnode]) //树边
{
int lowv = tarjan_dfs(nextnode,cur);
if (lowv > new_time[cur])
{
E[cur][i].isbridge = ;
#ifdef localtest
cout << cur << " - " << nextnode << " is a bridge " << endl;
#endif
use[cur] = true , use[nextnode] = true;
}
low[cur] = min(low[cur],lowv); // updata
}
else if(new_time[nextnode] < new_time[cur] && nextnode != pre) //反向边
low[cur] = min(low[cur],low[nextnode]);
}
return low[cur];
} int main(int argc,char *argv[])
{
while(~scanf("%d%d",&n,&m))
{
spj.clear();
for(int i = ; i <= m ; ++ i)
{
int u,v;
scanf("%d%d",&u,&v);
if (u > v)
swap(u,v);
Etype temp(u,v);
if (spj.count(temp))
continue;
else
spj.insert(temp);
E[u].pb(Edge(v)) , E[v].pb(Edge(u));
}
memset(new_time,,sizeof(new_time));
memset(number,,sizeof(number));
memset(use,false,sizeof(use));
memset(degree,,sizeof(degree));
T = ;
for(int i = ; i <= n ; ++ i)
if (!new_time[i])
tarjan_dfs(i,); //跑割桥
for(int i = ; i <= n ; ++ i)
{
for(int j = ; j < E[i].size() ; ++ j)
{
int nextnode = E[i][j].v;
if (low[i] != low[nextnode]) //缩点
{
degree[low[i]] ++ ;
degree[low[nextnode]] ++ ;
}
}
}
int leaf = ;
for(int i = ; i <= n ; ++ i)
if (degree[i] == )
leaf++;
printf("%d\n",(leaf+)/);
for(int i = ; i <= n ; ++ i)
E[i].clear();
}
return ;
}
UESTC_方老师和农场 2015 UESTC Training for Graph Theory<Problem L>的更多相关文章
- UESTC_邱老师的脑残粉 2015 UESTC Training for Graph Theory<Problem D>
D - 邱老师的脑残粉 Time Limit: 12000/4000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Sub ...
- UESTC_小panpan学图论 2015 UESTC Training for Graph Theory<Problem J>
J - 小panpan学图论 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) S ...
- UESTC_韩爷的情书 2015 UESTC Training for Graph Theory<Problem H>
H - 韩爷的情书 Time Limit: 6000/2000MS (Java/Others) Memory Limit: 262144/262144KB (Java/Others) Subm ...
- UESTC_秋实大哥带我飞 2015 UESTC Training for Graph Theory<Problem B>
B - 秋实大哥带我飞 Time Limit: 300/100MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- UESTC_邱老师选妹子 2015 UESTC Training for Dynamic Programming<Problem H>
H - 邱老师选妹子 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- UESTC_邱老师玩游戏 2015 UESTC Training for Dynamic Programming<Problem G>
G - 邱老师玩游戏 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- UESTC_邱老师看电影 2015 UESTC Training for Dynamic Programming<Problem F>
F - 邱老师看电影 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- UESTC_王之盛宴 2015 UESTC Training for Graph Theory<Problem K>
K - 王之盛宴 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- UESTC_排名表 2015 UESTC Training for Graph Theory<Problem I>
I - 排名表 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit S ...
随机推荐
- Android ActionBar详解(二):ActionBar实现Tabs标签以及下拉导航
一.添加标签 Tabs 在ActionBar中实现标签页可以实现android.app.ActionBar.TabListener ,重写onTabSelected.onTabUnselected ...
- 8个常用的Android开发工具
周末发现一些比较有用的android开发常用的工具,里面大部分是自己经常用的,还有一些暂时很少用,暂且在这里记录下,以后一定同样会经常用到的. 1 The SDK and AVD Manager 这个 ...
- Oracle SQL ANY和ALL语句
Oracle的嵌套子查询可以使用Some,Any和All对子查询中返回的多行结果进行处理. Some表示满足其中一个的含义,是用or串起来的比较从句. 例如:SELECT * FROM emp WHE ...
- 【转】Cocoa中的位与位运算
转自:http://www.tuicool.com/articles/niEVjy 介绍 位操作是程序设计中对位模式或二进制数的一元和二元操作. 在许多古老的微处理器上, 位运算比加减运算略快, 通常 ...
- 解析Function.prototype.bind
简介 对于一个给定的函数,创造一个绑定对象的新函数,这个函数和之前的函数功能一样,this值是它的第一个参数,其它参数,作为新的函数的给定参数. bind的作用 bind最直接的作用就是改变this的 ...
- MVC学习四
第七节 讲述了增加model中类的属性,由于数据库中已存在表,表中没有存在新加的列,所以可以删除数据库或者在数据库中新增一列,另可以在controller中新增一个数据库初始化的类,并在Globa ...
- Windows命令行(DOS命令)教程-3(转载)http://arch.pconline.com.cn//pcedu/rookie/basic/10111/15325_2.html
五.常用命令 DOS命令总共大约有一百个(包括文本编辑.查杀病毒.配置文件.批处理等),我们这里详细介绍二十个常用的DOS命令. 先介绍一下通配符的概念. 通配符*和? *表示一个字符串 ?只代表一个 ...
- java文件读写的两种方式
今天搞了下java文件的读写,自己也总结了一下,但是不全,只有两种方式,先直接看代码: public static void main(String[] args) throws IOExceptio ...
- Palindrome Number 回文数
判断一个数字是否是回文数,尝试不用其他额外空间. 注意: 负数也有可能成为回文数吗? 如果你想让int转为string,注意不用其他空间这个约束. 你也可以翻转一个int,但是有可能会溢出. ...
- 16 Socket通信(简单例子)
服务端代码: import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.Da ...