POJ3177 Redundant Paths【双连通分量】
题意:
有F个牧场,1<=F<=5000,现在一个牧群经常需要从一个牧场迁移到另一个牧场。奶牛们已经厌烦老是走同一条路,所以有必要再新修几条路,这样它们从一个牧场迁移到另一个牧场时总是可以选择至少两条独立的路。现在F个牧场的任何两个牧场之间已经至少有一条路了,奶牛们需要至少有两条。给定现有的R条直接连接两个牧场的路,F-1<=R<=10000,计算至少需要新修多少条直接连接两个牧场的路,使得任何两个牧场之间至少有两条独立的路。两条独立的路是指没有公共边的路,但可以经过同一个中间顶点。
思路:
给定一个无向连通图,判断至少需要加多少条边,使得任意两点之间至少有两条相互‘边独立’的道路,也就是说,至少加多少条边,使得这个图成为一个边双连通图。首先已经有了一个连通图,那么将所有的双连通块看成一个点,这样可以得到一颗树,因为它们当中没有环,而又是一个连通的图,所以可以肯定的是,这样缩点之后可以得到一颗树,这样的树至少需要加多少条边就能构成一个双连通图呢,只需要将叶子节点连起来即可,所以最少要连的边=(叶子节点数+1)/2。而求边连通分量,用tarjan就可以求出哪个点属于哪个双连通块中,然后再计算度为1的节点就可以了。因为是一个无向图,所以是度为1的点为叶子节点,而不是度为0。
代码:
Tarajn:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define maxn 5005 int n,m,low[maxn],dfn[maxn],sum,cnt[maxn];
bool map[maxn][maxn],vis[maxn]; void init()
{
memset(vis,,sizeof(vis));
memset(low,,sizeof(low));
memset(dfn,,sizeof(dfn));
sum=;
} void dfs(int x,int pre){
int i;
vis[x]=;
low[x]=dfn[x]=++sum;
for(i=;i<=n;i++){
if(map[x][i]){
if(!vis[i]){
dfs(i,x);
low[x]=min(low[x],low[i]);
}
if(vis[i]== && i!=pre){
low[x]=min(low[x],dfn[i]);
}
}
}
} int main()
{
int a,b,i,j;
while(cin>>n>>m)
{
memset(map,,sizeof(map));
while(m--)
{
cin>>a>>b;
map[a][b]=map[b][a]=;
}
init();
dfs(,);
memset(cnt,,sizeof(cnt));
for(i=;i<=n;i++) //计算每个点的度
{
for(j=;j<=n;j++)
if(map[i][j])
{
if(low[i]!=low[j])
{
cnt[low[j]]++;
}
}
}
int ans=; //计算度为1的点的个数
for(i=;i<=n;i++)
{
if(cnt[i]==) ans++;
}
cout<< (ans+)/ <<endl;;
}
return ;
}
POJ3177 Redundant Paths【双连通分量】的更多相关文章
- POJ3177 Redundant Paths 双连通分量
Redundant Paths Description In order to get from one of the F (1 <= F <= 5,000) grazing fields ...
- POJ3177 Redundant Paths(边双连通分量+缩点)
题目大概是给一个无向连通图,问最少加几条边,使图的任意两点都至少有两条边不重复路径. 如果一个图是边双连通图,即不存在割边,那么任何两个点都满足至少有两条边不重复路径,因为假设有重复边那这条边一定就是 ...
- poj3352 Road Construction & poj3177 Redundant Paths (边双连通分量)题解
题意:有n个点,m条路,问你最少加几条边,让整个图变成边双连通分量. 思路:缩点后变成一颗树,最少加边 = (度为1的点 + 1)/ 2.3177有重边,如果出现重边,用并查集合并两个端点所在的缩点后 ...
- poj3177 Redundant Paths 边双连通分量
给一个无向图,问至少加入多少条边能够使图变成双连通图(随意两点之间至少有两条不同的路(边不同)). 图中的双连通分量不用管,所以缩点之后建新的无向无环图. 这样,题目问题等效于,把新图中度数为1的点相 ...
- POJ3177 Redundant Paths 图的边双连通分量
题目大意:问一个图至少加多少边能使该图的边双连通分量成为它本身. 图的边双连通分量为极大的不存在割边的子图.图的边双连通分量之间由割边连接.求法如下: 求出图的割边 在每个边双连通分量内Dfs,标记每 ...
- POJ3177 Redundant Paths —— 边双联通分量 + 缩点
题目链接:http://poj.org/problem?id=3177 Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Total ...
- [POJ3177]Redundant Paths(双联通)
在看了春晚小彩旗的E技能(旋转)后就一直在lol……额抽点时间撸一题吧…… Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Tota ...
- [POJ3177]Redundant Paths(双连通图,割边,桥,重边)
题目链接:http://poj.org/problem?id=3177 和上一题一样,只是有重边. 如何解决重边的问题? 1. 构造图G时把重边也考虑进来,然后在划分边双连通分量时先把桥删去,再划分 ...
- poj3177 && poj3352 边双连通分量缩点
Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12676 Accepted: 5368 ...
- poj3177(边双连通分量+缩点)
传送门:Redundant Paths 题意:有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新建多少条路,使得任何两个牧场之间至少有两条独立 ...
随机推荐
- BZOJ3718[PA2014]Parking——树状数组
题目描述 你的老板命令你将停车场里的车移动成他想要的样子.停车场是一个长条矩形,宽度为w.我们以其左下角顶点为原点,坐标轴平行于矩形的边,建立直角坐标系.停车场很长,我们可以认为它一直向右边伸展到无穷 ...
- MT【39】构造二次函数证明
这种构造二次函数的方法最早接触的应该是在证明柯西不等式时: 再举一例: 最后再举个反向不等式的例子: 评:此类题目的证明是如何想到的呢?他们都有一个明显的特征$AB\ge(\le)C^2$,此时构造二 ...
- 【转】Linux系统进程的知识总结,进程与线程之间的纠葛
我们先打个比方,多线程是十字路口多线程是平面交通系统,造价低,但是红绿灯多,老堵车,而多进程是则是立交桥,虽然造价高,上下坡多耗油,但是不堵车.这是一个抽象的概念.相信大家看完会有这种感觉. 进程和线 ...
- SQLite 学习笔记(一)
(1)创建数据库 在命令行中切换到sqlite.exe所在的文件夹 在命令中键入sqlite3 test.db;即可创建了一个名为test.db的数据库 由于此时的数据库中没有任何表及 ...
- xrandr: 命令行修改分辨率工具
常用功能举例 查看支持的分辨率 xrandr -q 将分辨率设为1024×768 xrandr -s 1024×768 恢复到默认分辨率 xrandr -s 0
- A1082. Read Number in Chinese
Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese ...
- A1104. Sum of Number Segments
Given a sequence of positive numbers, a segment is defined to be a consecutive subsequence. For exam ...
- Codeforce Div-2 985 C. Liebig's Barrels
http://codeforces.com/contest/985/problem/C C. Liebig's Barrels time limit per test 2 seconds memory ...
- pyqt4
PyQt4 工具包简介1.1 关于本指南 这是一个入门级的 PyQt 指南.其目的在于引导读者快速上手 PyQt4 工具包.该指南在 Linux 环境下创建并通过测试. 关于 PyQt PyQt 是用 ...
- git 线上回滚问题纪要
1. git revert 作用 revert 用来取消置顶的提交的内容 2. 前提说明 当讨论 revert 时,需要分两种情况,因为 commit 分为两种: 一种是常规的 commit,也就是使 ...