Luogu P2860 [usaco 06jan] Redundant path Redundant Paths (tarjan dual-Unicom component), p2860usaco 06jan
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 particle 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.
In order to walk from one of the pastures of F (1 ≤ F ≤ 5000) to another, Bessie and her companions sometimes had to pass through some terrible trees they hated. the cows are tired of being forced to take a certain path, so they want to build new roads so that each pair of pastures can have at least two separate paths, so that they have more options.
There is already at least one path between each pair of pastures. all R (F-1 ≤ R ≤ 10000) two-way road description, each road connected to two different pastures, Please calculate the minimum number of new roads, the path is composed of several roads connected at the beginning and end. two paths are separated from each other, which means there is no overlap between the two paths. however, the two separated paths can have some identical pastures. there may already be two different roads between the same grassland. You can also build another road between them as another different road.
Input/Output Format
Input Format:
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.
Output Format:
Line 1: A single integer that is the number of new paths that must be built.
Input and Output sample input sample #1: Copy
7 71 22 33 42 54 55 65 7
Output example #1: Copy
2
Description
Explanation of the sample:
One visualization of the paths is:
1 2 3
+ --- +
| | | |
6 + --- + 4
/5 // 7 + Building new paths from 1 to 6 and from 4 to 7 satisfies the conditions.
1 2 3
+ --- +
6 + --- + 4
/5 :/:
/:
7 +---Check some of the routes:
1-2: 1-> 2 and 1-> 6-> 5-> 2
1-4: 1-> 2-> 3-> 4 and 1-> 6-> 5-> 4
3-7: 3-> 4-> 7 and 3-> 2-> 5-> 7
Every pair of fields is, in fact, connected by two routes.
It's possible that adding some other path will also solve the problem (like one from 6 to 7). Adding two paths, however, is the minimum.
First, we do not need to consider the points in the dual-China Unicom component.
Therefore, we first use tarjan to scale out the dual-China Unicom component.
In this case, a tree will be formed.
Next we will consider greed. For any three vertices that are not in the same pair of Unicom components and have a unique inbound degree
We connect an edge between them, which must be optimal.
Therefore, we only need to count the point with an inbound value of 1.
The final answer is $ (ans + 1)/2 $
// Luogu-judger-enable-o2 # include <cstdio> # include <cstring> # include <algorithm> # include <stack> # define getchar () (S = T & (T = (S = BB) + fread (BB, 1, 1 <15, stdin), S = T )? EOF: * S ++) char BB [1 <15], * S = BB, * T = BB; using namespace std; const int MAXN = 1e5 + 10; inline int read () {char c = getchar (); int x = 0, f = 1; while (c <'0' | c> '9 ') {if (c = '-') f =-1; c = getchar () ;}while (c> = '0' & c <= '9 ') {x = x * 10 + c-'0'; c = getchar ();} return x * f;} struct node {int u, v, w, nxt ;} edge [MAXN]; int head [MAXN], num = 1; inline void AddEdge (int x, int y) {edge [num]. u = x; edge [num]. v = y; edge [num]. nxt = head [x]; head [x] = Num ++;} int dfn [MAXN], low [MAXN], vis [MAXN], tot = 0, colornum = 0, color [MAXN], inder [MAXN]; int fuck [5001] [5001]; stack <int> s; void tarjan (int now, int fa) {dfn [now] = low [now] = ++ tot; s. push (now); vis [now] = 1; for (int I = head [now]; I! =-1; I = edge [I]. nxt) {if (! Dfn [edge [I]. v] & edge [I]. v! = Fa) tarjan (edge [I]. v, now), low [now] = min (low [now], low [edge [I]. v]); if (vis [edge [I]. v] & edge [I]. v! = Fa) low [now] = min (low [now], dfn [edge [I]. v]);} if (dfn [now] = low [now]) {int h = 0; colornum ++; do {h = s. top (); color [h] = colornum; s. pop () ;}while (h! = Now) ;}} int main () {# ifdef WIN32 freopen (". in "," r ", stdin); # else # endif memset (head,-1, sizeof (head); int N = read (), M = read (); for (int I = 1; I <= M; I ++) {int x = read (), y = read (); AddEdge (x, y ); addEdge (y, x);} tarjan (); for (int I = 1; I <= num-1; I ++) if (color [edge [I]. u]! = Color [edge [I]. v] & fuck [edge [I]. u] [edge [I]. v] = 0) fuck [edge [I]. u] [edge [I]. v] = 1, inder [color [edge [I]. u] ++, inder [color [edge [I]. v] ++; int ans = 0; for (int I = 1; I <= colornum; I ++) if (inder [I] = 2) // bidirectional edge ans ++; printf ("% d", (ans + 1)> 1); return 0 ;}