We know that to construct a non-edge double connected graph into a two-side connected graph, we just need to make the graph simple (the edge of the two connected components) into a tree, and then find the leaf node number leaf, (leaf+1)/2 is the number of new edges to add.
Now, to the graph, we need to add the least edge, so that a non-strong connected graph into a strong connected graph, the minimum number of edges?
Similarly, we need to reduce the number of vertices (strongly connected components) into a DAG graph (directed acyclic graph), and then find the number of vertex in with a degree of 0, and a vertex with a degree of 0 out, whichever is the minimum number of edges to add.
For a special case, the Wakahara diagram itself is a strong connected graph, then the DGA graph after the contraction point is an isolated point, in and out is equal to 1, the answer is 1 according to the above method, obviously and the correct answer 0 is different, so, we have a special sentence here.
POJ 1236
1#include <cstdio>2#include <cstring>3#include <queue>4#include <algorithm>5 #define_CLR (x, y) memset (x, y, sizeof (x))6 #defineINF 0x3f3f3f3f7 #defineN 1108 using namespacestd;9 Ten structNode One { A intto, next; -}edge[n* -]; - inthead[n], tot; the intDfn[n], low[n]; - intSta[n], bleg[n]; - BOOLInstack[n]; - intN, CNT, top, ght; + - voidInit () + { Acnt=tot=top=ght=0; at_CLR (Head,-1); -_CLR (DFN,0); -_CLR (Instack,0); - } - - voidAdd_edge (intAintb) in { -Edge[tot].to =b; toEdge[tot].next =Head[a]; +Head[a] = tot++; - } the * voidDfsintu) $ {Panax Notoginsengdfn[u]=low[u]=++CNT; -Instack[u] =true; thesta[top++] =u; + for(intI=head[u]; i!=-1; I=edge[i].next) A { the intv =edge[i].to; + if(!Dfn[v]) - { $ Dfs (v); $Low[u] =min (Low[u], low[v]); - } - Else if(Instack[v]) low[u] =min (Low[u], dfn[v]); the } - if(low[u]==Dfn[u])Wuyi { theght++; - //printf ("num:%d\n", ght); Wu intv; - Do About { $v = sta[--top]; - //printf ("%d", v); -INSTACK[V] =false; -BLEG[V] =ght; A} while(U! =v); + //puts (""); the } - } $ the intInde[n], outde[n]; the voidTarjan () the { the for(intI=1; i<=n; i++) - if(!Dfn[i]) DFS (i); in the_CLR (Inde,0); the_CLR (OUTDE,0); About for(intu=1; u<=n; u++) the for(intI=head[u]; i!=-1; I=edge[i].next) the { the intv =edge[i].to; + if(Bleg[v]! =Bleg[u]) -inde[bleg[v]]++, outde[bleg[u]]++; the }Bayi } the the voidSolved () - { - intA=0, b=0; the if(ght==1) theprintf"1\n0\n"); the Else the { - for(intI=1; i<=ght; i++) the { the if(inde[i]==0) a++; the if(outde[i]==0) b++;94 } theprintf"%d\n%d\n", A, Max (A, b)); the } the }98 intMain () About { - intb;101 while(~SCANF ("%d", &N))102 {103 Init ();104 for(intI=1; i<=n; i++) the {106 while(SCANF ("%d", &b) &&b)107 Add_edge (i, b);108 }109 Tarjan (); the Solved ();111 } the return 0;113}
View Code
Constructing strong connected graphs