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

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

Time Limit: 5 Sec  Memory Limit: 64 MB
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1718

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

题解:边双连通分量裸题

#include<bits/stdc++.h>
using namespace std;

const int maxn = 10005, inf = 1000000008;
int du[maxn], dfn[maxn],low[maxn],h[maxn],place[maxn],tot,idx,scccnt;
bool ins[maxn], vis[maxn<<1];
struct edge{
    int v,nxt;
}G[maxn<<1];
stack <int> s;
void add(int u,int v){
    G[++tot].nxt = h[u]; h[u] = tot; G[tot].v = v;
}
void tarjan(int u, int d){
    dfn[u] = low[u] = ++idx;
    s.push(u); ins[u] = 1;

    for(int i = h[u]; i; i = G[i].nxt){
        if(vis[i^1])continue;
        vis[i] = 1;
        int v = G[i].v;
        if(!dfn[v]){
            tarjan(v, i);
            low[u] = min(low[u], low[v]);
        }
        else if(ins[v]) low[u] = min(low[u], dfn[v]);
    }

    if(low[u] == dfn[u]){
        scccnt++;
        while(1){
            int t = s.top();
            ins[t] = 0;
            place[t] = scccnt;
            s.pop();
            if(t == u)break;
        }
    }
}
int main(){
    int F, R, leaf = 0;
    tot = 1;
    scanf("%d%d",&F,&R);
    for(int i = 1; i <= R; i++){
        int u,v;
        scanf("%d%d",&u, &v);
        add(u, v); add(v, u);
    }
    for(int i = 1; i <= F; i++)
        if(!dfn[i])tarjan(i, inf);
    for(int i = 1; i <= F; i++)
        for(int j = h[i]; j; j = G[j].nxt){
            int v = G[j].v;
            if(place[i] != place[v])
                du[place[i]]++;
        }
    for(int i = 1; i <= scccnt; i++)
        if(du[i] == 1)leaf++;
    printf("%d\n",(leaf+1)/2);
}

原文地址:https://www.cnblogs.com/EdSheeran/p/9029334.html

时间: 2024-11-05 13:25:48

1718: [Usaco2006 Jan] Redundant Paths 分离的路径的相关文章

BZOJ 1718: [Usaco2006 Jan] Redundant Paths 分离的路径( tarjan )

tarjan求边双连通分量, 然后就是一棵树了, 可以各种乱搞... ------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 5009; struct edge { int to; b

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

Description 给出一个无向图,求将他构造成双连通图所需加的最少边数. Sol Tarjan求割边+缩点. 求出割边,然后缩点. 将双连通分量缩成一个点,然后重建图,建出来的就是一棵树,因为每一条边都是桥. 然后每次合并这棵树上的叶节点两点距离LCA最远的点,这样就会形成一个环,是双连通的,然后进行(ans+1)/2次操作就可以了. 其实就是(叶节点个数+1)/2 Code #include<cstdio> #include<vector> #include<iost

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

n<=5000个点m<=10000条边的无向图,求最少加几条边使它变成边双联通图,就是任意两点间都有至少2条边不相交的路径. tarjan缩点,答案是叶子节点数/2向上取整. 不过要注意这里的"叶子节点数"是指度数为1的点,并不是最后那棵树以某个点为根的叶子节点树.如果找叶子点数一定要以某个点为根,就会像我一样WA两次然后发现缩点后只有一个点时答案为0. 1 #include<stdio.h> 2 #include<string.h> 3 #incl

Redundant Paths 分离的路径(边双连通分量)

题干: 为了从F(1≤F≤5000)个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们已经厌倦了被迫走某一条路,所以她们想建一些新路,使每一对草场之间都会至少有两条相互分离的路径,这样她们就有多一些选择.每对草场之间已经有至少一条路径.给出所有 R ( F - 1 ≤ R ≤ 10000 )条双向路的描述,每条路连接了两个不同的草场,请计算最少的新建道路的数量, 路径由若干道路首尾相连而成.两条路径相互分离,是指两条路径没有一条重合的道路.但是,两条分离的路径

【BZOJ1718】&amp;&amp;【POJ3177】Redundant Paths

1718: [Usaco2006 Jan] Redundant Paths 分离的路径 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 452  Solved: 239[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 f

洛谷P2860 [USACO06JAN]冗余路径Redundant Paths

题目描述 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 t

Luogu2860 [USACO06JAN]冗余路径Redundant Paths

\(\verb|Luogu2860 [USACO06JAN]冗余路径Redundant Paths|\) 给定一个连通无向图,求至少加多少条边才能使得原图变为边双连通分量 \(1\leq n\leq5000,\ n-1\leq m\leq10^4\) tarjan 边双无疑不用考虑,于是就可以边双缩点成一棵树 令现在要连的边为 \((u,\ v)\) ,点集 \(\{u->lca(u,\ v),\ v->lca(u,\ v)\}\) 将会变为一个新的点双,可以将他们看为一个新的点 可以贪心地连

冗余路径 Redundant Paths e-DCC缩点

冗余路径 Redundant Paths 题目传送 sol: 如果两点间存在至少两条不重复的路径,这说明他们两点在同一个边双连通分量(不存在割边). 那么可以进行e-DCC的缩点,得到一棵树. 对于这棵树广泛意义上的叶子节点(度数为1)而言,都还至少需要一条边连向他. 那么可以贪心的一次连两个叶子节点,答案显然就是\(cnt+1>>1\). #include<bits/stdc++.h> #define IL inline #define RG register #define D

[USACO06JAN]冗余路径Redundant Paths(缩点)

为了从F(1≤F≤5000)个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们已经厌倦了被迫走某一条路,所以她们想建一些新路,使每一对草场之间都会至少有两条相互分离的路径,这样她们就有多一些选择. 每对草场之间已经有至少一条路径.给出所有R(F-1≤R≤10000)条双向路的描述,每条路连接了两个不同的草场,请计算最少的新建道路的数量, 路径由若干道路首尾相连而成.两条路径相互分离,是指两条路径没有一条重合的道路.但是,两条分离的路径上可以有一些相同的草场.