tarjan求边双连通分量, 然后就是一棵树了, 可以各种乱搞...

-------------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
 
using namespace std;
 
const int maxn = 5009;
 
struct edge {
int to;
bool t;
edge* next;
} E[20009], *pt = E, *head[maxn];
 
void add(int u, int v) {
pt->to = v; pt->next = head[u]; head[u] = pt++;
}
void addedge(int u, int v) {
add(u, v); add(v, u);
}
 
edge* rev(edge* e) {
return E + ((e - E) ^ 1);
}
 
int Id(edge* e) {
return (e - E) >> 1;
}
 
int dfn[maxn], low[maxn], cc[maxn];
int N, CK = 0, n = 0, ans = 0;
bool B[maxn], vis[maxn];
 
void init() {
int m;
scanf("%d%d", &N, &m);
while(m--) {
int u, v; scanf("%d%d", &u, &v);
addedge(--u, --v);
}
}
 
void tarjan(int x, edge* r = NULL) {
dfn[x] = low[x] = ++CK;
for(edge* e = head[x]; e; e = e->next) if(e != r) {
if(!dfn[e->to]) {
tarjan(e->to, rev(e));
if(low[e->to] > dfn[x]) 
B[Id(e)] = true;
else
low[x] = min(low[e->to], low[x]);
} else 
low[x] = min(low[x], dfn[e->to]);
}
}
 
void dfs(int x, edge* r = NULL) {
vis[x] = true;
cc[x] = n;
for(edge* e = head[x]; e; e = e->next) 
if(!vis[e->to] && e != r && !B[Id(e)]) dfs(e->to, rev(e));
}
 
namespace tree {
edge E[20009], *head[maxn], *pt = E;
void addedge(int u, int v) {
pt->to = v; pt->next = head[u]; head[u] = pt++;
}
void dfs(int x, int fa = -1) {
int ch = 0;
for(edge* e = head[x]; e; e = e->next)
if(e->to != fa) ch++, dfs(e->to, x);
if(!ch || (!~fa && ch == 1)) ans++;
}
}
 
void work() {
memset(dfn, 0, sizeof dfn);
memset(vis, 0, sizeof vis);
memset(B, 0, sizeof B);
for(int i = 0; i < N; i++) if(!dfn[i]) tarjan(i);
for(int i = 0; i < N; i++)
if(!vis[i]) dfs(i), n++;
if(n == 1) {
puts("0");
return;
}
for(int x = 0; x < N; x++)
for(edge* e = head[x]; e; e = e->next)
if(cc[x] != cc[e->to]) tree::addedge(cc[x], cc[e->to]);
tree::dfs(0);
printf("%d\n", (++ans) >> 1);
}
 
int main() {
init();
work();
return 0;
}

-------------------------------------------------------------------------------

1718: [Usaco2006 Jan] Redundant Paths 分离的路径

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 281  Solved: 151
[Submit][Status][Discuss]

Description

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

Input

* 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.

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

Output

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

    最少的需要新建的道路数.

Sample Input

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

Sample Output

2

HINT

Source

BZOJ 1718: [Usaco2006 Jan] Redundant Paths 分离的路径( tarjan )的更多相关文章

  1. BZOJ 1718: [Usaco2006 Jan] Redundant Paths 分离的路径

    Description 给出一个无向图,求将他构造成双连通图所需加的最少边数. Sol Tarjan求割边+缩点. 求出割边,然后缩点. 将双连通分量缩成一个点,然后重建图,建出来的就是一棵树,因为每 ...

  2. bzoj 1718: [Usaco2006 Jan] Redundant Paths 分离的路径【tarjan】

    首先来分析一下,这是一张无向图,要求没有两条路联通的点对个数 有两条路连通,无向图,也就是说,问题转化为不在一个点双连通分量里的点对个数 tarjan即可,和求scc还不太一样-- #include& ...

  3. 【BZOJ】1718: [Usaco2006 Jan] Redundant Paths 分离的路径

    [题意]给定无向连通图,要求添加最少的边使全图变成边双连通分量. [算法]Tarjan缩点 [题解]首先边双缩点,得到一棵树(无向无环图). 入度为1的点就是叶子,两个LCA为根的叶子间合并最高效,直 ...

  4. [Usaco2006 Jan] Redundant Paths 分离的路径

    1718: [Usaco2006 Jan] Redundant Paths 分离的路径 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1132  Solv ...

  5. [BZOJ1718]:[Usaco2006 Jan] Redundant Paths 分离的路径(塔尖)

    题目传送门 题目描述 为了从F个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们已经厌倦了被迫走某一条路,所以她们想建一些新路,使每一对草场之间都会至少有两条相互分 ...

  6. BZOJ1718 [Usaco2006 Jan] Redundant Paths 分离的路径

    给你一个无向图,问至少加几条边可以使整个图变成一个双联通分量 简单图论练习= = 先缩点,ans = (度数为1的点的个数) / 2 这不是很好想的么QAQ 然后注意位运算的优先级啊魂淡!!!你个sb ...

  7. BZOJ1718: [Usaco2006 Jan] Redundant Paths 分离的路径【边双模板】【傻逼题】

    LINK 经典傻逼套路 就是把所有边双缩点之后叶子节点的个数 //Author: dream_maker #include<bits/stdc++.h> using namespace s ...

  8. 【bzoj1718】Redundant Paths 分离的路径

    1718: [Usaco2006 Jan] Redundant Paths 分离的路径 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 964  Solve ...

  9. Redundant Paths 分离的路径【边双连通分量】

    Redundant Paths 分离的路径 题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields ...

随机推荐

  1. 删除windows7保留分区

    在系统里以管理员运行CMD.exe键入diskpartsel disk 0  (select 选择硬盘)list vol  (查看卷)sel vol 0  (选择卷,0为保留分区)inactive ( ...

  2. 2015 11 27编写JAVA程序

    在任意文件下 ,建立一个文本文档,更改其txt格式为java格式, 打开此程序的同时打开eclipse可编写代码. public class 文件名{ public static void main( ...

  3. Cocos2d-x lua游戏开发之安装Lua到mac系统

    注意:mac ox .lua version :5.15 下载lua官网的lua, 注意:最好是5.15下面.5.2的lua不支持table的getn()方法,这让我情何以堪.(获取table长度.相 ...

  4. CF# 260 A. Laptops

    One day Dima and Alex had an argument about the price and quality of laptops. Dima thinks that the m ...

  5. Android基础之在Eclipes中关联SDK源码和查看SDK源码

    在进行Android应用开发的时候,我们有时候需要查看某个类或接口的源码从而了解如何去使用一个类或者实现一个接口,查看源码有助于我们的学习某个封装的类的底层是如何实现的,这样可以帮助我们掌握类或者接口 ...

  6. Arcgis for javascript不同的状态下自己定义鼠标样式

    俗话说:爱美之心.人皆有之. 是的.没错,即使我仅仅是一个做地图的,我也希望自己的地图看起来好看一点. 在本文,给大家讲讲在Arcgis for javascript下怎样自己定义鼠标样式. 首先.说 ...

  7. mvc 防止客服端多次提交

    但凡web开发中都会有户多次点击了提交按钮导致多次提交的情况,一般的集中做法 1.通过js在用户点击的时候将按钮disabled掉,但是这样并不是很可靠(我就可以跳过这个,用一个for循环 我直接自己 ...

  8. 关于javascript面向对象之闭包

    要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量,而在函数外部无法 ...

  9. Jquery的一些简单使用记录

    //平滑滚动到底部 $(".list").scrollTo('100%', '100%', { easing: 'swing' }); //直接滚动至底部(无效果) $('.lis ...

  10. linux查看和设置系统时间 hwclock && date

    http://www.linuxso.com/command/hwclock.html查看时间{1. date查看系统时钟, hwclock查看硬件时钟hwclock && date ...