HDU_3836 Equivalent Set (Trajan 强连通分量 缩点)

  求出强连通分量,缩点。得到新图DAG, 求DAG中max(入度为0的点数,出度为0的点数);

渣代码:

View Code
  1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <stack>
5
6 using namespace std;
7
8 const int N = 20010;
9 const int M = 50010;
10
11 struct node {
12 int to;
13 node* next;
14 } *first[M];
15
16 int head[N], blong[N];
17 int dfn[N], low[N];
18 int in[N], out[N];
19 int cnt, t, ind;
20 bool vis[N];
21
22 stack<int> s;
23
24 void init() {
25 memset(head, 0, sizeof(head));
26 memset(blong, 0, sizeof(blong));
27 memset(dfn, 0, sizeof(dfn));
28 memset(low, 0, sizeof(low));
29 memset(out, 0, sizeof(out));
30 memset(vis, 0, sizeof(vis));
31 memset(in, 0, sizeof(in));
32 memset(first, NULL, sizeof(first));
33
34 t = 1; ind = cnt = 0;
35 }
36
37 void add(int u, int v) {
38 node *tmp = new node;
39 tmp->to = v;
40 tmp->next = first[u];
41 first[u] = tmp;
42 }
43
44 void tarjan(int u) {
45 int v;
46 vis[u] = true;
47 s.push(u);
48 low[u] = dfn[u] = ++ind;
49 for(node* pos = first[u]; pos != NULL; pos = pos->next) {
50 v = pos->to;
51 if(!dfn[v]) {
52 tarjan(v);
53 low[u] = min(low[v], low[u]);
54 } else if(vis[v]) {
55 low[u] = min(low[u], low[v]);
56 }
57 }
58 if(low[u] == dfn[u]) {
59 cnt++;
60 do {
61 v = s.top(); s.pop();
62 blong[v] = cnt;
63 vis[v] = false;
64 //printf("%d %d\n", v, cnt);
65 } while(v != u);
66 }
67 }
68
69 int main() {
70 //freopen("data.in", "r", stdin);
71
72 int n, m, a, b, i;
73 while(~scanf("%d%d", &n, &m)) {
74 init();
75 for(i = 1; i <= m; i++) {
76 scanf("%d%d", &a, &b);
77 add(b, a);
78 }
79
80 for(i = 1; i <= n; i++) {
81 if(!dfn[i]) tarjan(i);
82 }
83 if(cnt == 1) { printf("0\n"); continue;} //注意,只有一个强连通分量时
84 for(i = 1; i <= n; i++) {
85 for(node* p = first[i]; p != NULL; p = p->next) {
86 a = p->to;
87 if(blong[i] != blong[a]) {
88 in[blong[a]] ++;
89 out[blong[i]] ++;
90 }
91 }
92 }
93 a = b = 0;
94 for(i = 1; i <= cnt; i++) {
95 if(!in[i]) a++;
96 if(!out[i]) b++;
97 }
98 printf("%d\n", max(a, b));
99 }
100 return 0;
101 }



posted @ 2012-02-11 20:51  AC_Von  阅读(263)  评论(0编辑  收藏  举报