Description
曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街。河蟹看到欢快的曹,感到不爽。河蟹决定封锁阳光大学,不让曹刷街。
阳光大学的校园是一张由N个点构成的无向图,N个点之间由M条道路连接。每只河蟹可以对一个点进行封锁,当某个点被封锁后,与这个点相连的道路就被封锁了,曹就无法在与这些道路上刷街了。非常悲剧的一点是,河蟹是一种不和谐的生物,当两只河蟹封锁了相邻的两个点时,他们会发生冲突。
询问:最少需要多少只河蟹,可以封锁所有道路并且不发生冲突。
Input
第一行:两个整数N,M
接下来M行:每行两个整数A,B,表示点A到点B之间有道路相连。
数据保证:
1<=N<=10000
1<=M<=100000
任意两点之间最多有一条道路。
Output
仅一行:如果河蟹无法封锁所有道路,则输出“Impossible”,否则输出一个整数,表示最少需要多少只河蟹。
Sample Input
样例输入1:
3 3
1 2
1 3
2 3
样例输入2:
3 2
1 2
2 3
Sample Output
样例输出1:
Impossible
样例输出2:
1
思路:
暴力。。。。。。
pascal:
var n,m,i,j,l,x,y,ans1,ans2,ans:longint;
a:array[1..10000,0..100] of longint;
b,bz:array[1..10000] of longint;
bt:array[1..10000] of boolean;
function min(x,y:longint):longint;
begin
if x<y then exit(x) else exit(y);
end;
procedure dg(x,y:longint);// y:boolean);
var i:longint;
begin
bt[x]:=true;
if b[x]<10 then
begin
b[x]:=b[x]+1;
begin
for i:=1 to a[x,0] do
begin
if y=1 then
begin
if bz[a[x,i]]<>1 then
begin
bz[a[x,i]]:=2;
dg(a[x,i],2);
end
else
begin
writeln('Impossible');
halt;
end;
end
else
begin
if bz[a[x,i]]<>2 then
begin
bz[a[x,i]]:=1;
dg(a[x,i],1);
end
else
begin
writeln('Impossible');
halt;
end;
end;
end;
end;
end;
end;
begin
readln(n,m);
for i:=1 to m do
begin
readln(x,y);
inc(a[x,0]);
a[x,a[x,0]]:=y;
inc(a[y,0]);
a[y,a[y,0]]:=x;
end;
for j:=1 to n do
if not bt[j] then
begin
ans1:=0;ans2:=0;
fillchar(bz,sizeof(bz),0);
fillchar(b,sizeof(b),0);
dg(j,1);
for i:=1 to n do if bz[i]=1 then inc(ans1);
for i:=1 to n do if bz[i]=2 then
begin
l:=i;
break;
end;
if l<>0 then
begin
fillchar(bz,sizeof(bz),0);
fillchar(b,sizeof(b),0);
dg(l,1);
for i:=1 to n do if bz[i]=1 then inc(ans2);
//writeln(min(ans1,ans2));
ans:=ans+min(ans1,ans2);
end
else
//writeln(ans1);
ans:=ans+ans1;
end;
writeln(ans);
end.
水法真神奇,暴力出奇迹。