2117

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