-
Notifications
You must be signed in to change notification settings - Fork 0
/
BiconnectedComponents.java
120 lines (116 loc) · 3.79 KB
/
BiconnectedComponents.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import java.util.* ;
import java.io.BufferedReader ;
import java.io.InputStreamReader ;
public class BiconnectedComponents
{
private static final boolean debug = false ;
private static final boolean debug2 = false ;
static int[] dfs_low,dfs_num,dfs_parent ;
static boolean[] visited ;
static int children=0,root,dfs_counter=0 ;
static List<List<Integer>> L = new ArrayList<List<Integer>>() ;
static ArrayDeque<Pair> dq = new ArrayDeque<Pair>() ;
static int even = 0 ,odd = 0 ;
public static void main(String args[]) throws Exception
{
BufferedReader bro = new BufferedReader(new InputStreamReader(System.in)) ;
String[] S = bro.readLine().split(" ") ;
int n = Integer.parseInt(S[0]) ;
int m = Integer.parseInt(S[1]) ;
for(int i=0;i<n;i++)
{
L.add(new ArrayList<Integer>()) ;
}
for(int i=0;i<m;i++)
{
S = bro.readLine().split(" ") ;
int a = Integer.parseInt(S[0]) ;
int b = Integer.parseInt(S[1]) ;
L.get(a).add(b) ;
L.get(b).add(a) ;
}
dfs_low = new int[n] ;
dfs_num = new int[n] ;
dfs_parent = new int[n] ;
visited = new boolean[n] ;
for(int i=0;i<n;i++)
{
if(!visited[i])
articulationPoints(i) ;
}
HashSet<Integer> H = new HashSet<Integer>() ;
while(!dq.isEmpty())
{
Pair temp = dq.pop() ;
if(debug) System.out.println("popped : "+temp.a+" "+temp.b) ;
H.add(temp.a) ;
H.add(temp.b) ;
}
if(H.size()%2==0)
even++ ;
else odd++ ;
System.out.println(odd+" "+even) ;
}
static void articulationPoints(int u)
{
if(debug) System.out.println("u :"+u) ;
visited[u] = true ;
dfs_low[u] = dfs_num[u] = dfs_counter++ ;
for(int i=0;i<L.get(u).size();i++)
{
int v = L.get(u).get(i) ;
if(!visited[v])
{
dfs_parent[v] = u ;
if(u==root) children++ ;
dq.push(new Pair(u,v)) ;
articulationPoints(v) ;
if(debug) System.out.println(" u :"+u) ;
if((u==root && children>1) ||(u!=root&&dfs_num[u]<=dfs_low[v]))
{
HashSet<Integer> H = new HashSet<Integer>() ;
H.add(u) ;
H.add(v) ;
if(debug2) System.out.println("dq : "+dq.toString()) ;
// dq.pop() ;
// if(debug2) System.out.println("dq : "+dq.toString()) ;
Pair temp = dq.pop() ;
if(debug2) System.out.println("u v ="+u+" "+v) ;
while(temp.a!=u || temp.b!=v)
{
H.add(temp.a) ;
H.add(temp.b) ;
// count++ ;
if(debug) System.out.println(temp.a+" "+temp.b) ;
temp = dq.pop() ;
}
// dq.pop() ;
if(debug2) System.out.println("dq : "+dq.toString()) ;
if(H.size() %2==0)
even++ ;
else odd++ ;
}
dfs_low[u] = Math.min(dfs_low[u],dfs_low[v]) ;
}
else if(dfs_parent[u]!=v && dfs_low[u]>dfs_num[v])
{
dfs_low[u] = dfs_num[v] ;
dq.push(new Pair(u,v)) ;
}
}
}
}
class Pair
{
int a,b ;
Pair(int a,int b)
{
this.a = a ;
this.b = b ;
}
@Override
public String toString()
{
return "["+a+","+b+"]" ;
}
}