1523

1 /*
2 此题出了求割点外,还要求割点把连通图分成了几个连通分量。
3 */
4
5 // include file
6 #include <cstdio>
7 #include <cstdlib>
8 #include <cstring>
9 #include <cmath>
10 #include <cctype>
11 #include <ctime>
12
13 #include <iostream>
14 #include <sstream>
15 #include <fstream>
16 #include <iomanip>
17 #include <bitset>
18
19 #include <algorithm>
20 #include <string>
21 #include <vector>
22 #include <queue>
23 #include <set>
24 #include <list>
25 #include <functional>
26
27 using namespace std;
28
29 // typedef
30 typedef long long LL;
31 typedef unsigned long long ULL;
32 typedef __int64 Bint;
33
34 //
35 #define read freopen("in.txt","r",stdin)
36 #define write freopen("out.txt","w",stdout)
37 #define FORi(a,b,c) for(int i=(a);i<(b);i+=c)
38 #define FORj(a,b,c) for(int j=(a);j<(b);j+=c)
39 #define FORk(a,b,c) for(int k=(a);k<(b);k+=c)
40 #define FORp(a,b,c) for(int p=(a);p<(b);p+=c)
41 #define FORii(a,b,c) for(int ii=(a);ii<(b);ii+=c)
42 #define FORjj(a,b,c) for(int jj=(a);jj<(b);jj+=c)
43 #define FORkk(a,b,c) for(int kk=(a);kk<(b);kk+=c)
44
45 #define FF(i,a) for(int i=0;i<(a);i++)
46 #define FFD(i,a) for(int i=(a)-1;i>=0;i--)
47
48 #define Z(a) (a<<1)
49 #define Y(a) (a>>1)
50
51 const double eps = 1e-6;
52 const double INFf = 1e10;
53 const int INFi = 1000000000;
54 const double Pi = acos(-1.0);
55
56 template<class T> inline T sqr(T a){return a*a;}
57 template<class T> inline T TMAX(T x,T y)
58 {
59 if(x>y) return x;
60 return y;
61 }
62 template<class T> inline T TMIN(T x,T y)
63 {
64 if(x<y) return x;
65 return y;
66 }
67 template<class T> inline void SWAP(T &x,T &y)
68 {
69 T t = x;
70 x = y;
71 y = t;
72 }
73 template<class T> inline T MMAX(T x,T y,T z)
74 {
75 return TMAX(TMAX(x,y),z);
76 }
77
78
79 // code begin
80 #define MAXN 1010
81 int N;
82 struct node1
83 {
84 int e;
85 int next;
86 };
87 struct node2
88 {
89 int next;
90 };
91 node1 mem[MAXN*MAXN];
92 node2 G[MAXN];
93 int dfn[MAXN];
94 int low[MAXN];
95 int cut[MAXN];
96 int used[MAXN];
97 int cnt;
98
99 void Add_edge(int dx,int a,int b)
100 {
101 mem[dx].e = b;
102 mem[dx].next = G[a].next;
103 G[a].next=dx;
104 }
105
106 void BCC_tarjan(int i,int fa)
107 {
108 dfn[i] = cnt;
109 low[i] = cnt;
110 cnt++;
111 used[i] = true;
112 int son = 0;
113 int dx = G[i].next;
114 while(dx!=-1)
115 {
116 int v = mem[dx].e;
117 if(!used[v])
118 {
119 BCC_tarjan(v,i);
120 low[i] = TMIN(low[i],low[v]);
121 if(fa==-1) son++;
122 else if(low[v]>=dfn[i])
123 {
124 cut[i]++;
125 }
126 }
127 else if(v!=fa)
128 {
129 low[i] = TMIN(low[i],dfn[v]);
130 }
131
132 dx = mem[dx].next;
133 }
134 if(fa==-1&&son>1) cut[i]+=son-1;
135 }
136
137 int main()
138 {
139 read;
140 write;
141 int dx,a,b,cas=1;
142 while(scanf("%d",&a)!=-1)
143 {
144 if(a==0) break;
145 FORi(1,MAXN,1)
146 {
147 G[i].next=-1;
148 }
149 dx = 0;
150 N = 0;
151 do
152 {
153 scanf("%d",&b);
154 if(a>N) N=a;
155 if(b>N) N=b;
156 Add_edge(dx++,a,b);
157 Add_edge(dx++,b,a);
158 }while(scanf("%d",&a)&&a);
159
160 memset(dfn,0,sizeof(dfn));
161 memset(low,0,sizeof(low));
162 memset(used,0,sizeof(used));
163 memset(cut,0,sizeof(cut));
164 cnt=1;
165 FORi(1,N+1,1)
166 {
167 if(!used[i])
168 BCC_tarjan(i,-1);
169 }
170 printf("Network #%d\n",cas++);
171 bool f = false;
172 FORi(1,N+1,1)
173 {
174 if(cut[i])
175 {
176 printf(" SPF node %d leaves %d subnets\n",i,cut[i]+1);
177 f=true;
178 }
179 }
180 if(!f)
181 printf(" No SPF nodes\n");
182 printf("\n");
183 }
184 return 0;
185 }
posted @ 2011-03-12 23:46  AC2012  阅读(503)  评论(0编辑  收藏  举报