这题做了半天……结果发现自己缩点错了……
言归正传,这题给了一个无向图G,求添加几条边后双连通……
做了一上午Tarjen不对……Low就是不满足性质(后来发现这是无向图的,要用有向图版本……——用有向图法做无向图……)
终于……做完了(请忽略Stack,我最后索性直接用Low值了……勉强算hash?)
Program P3352;
const
maxn=1000;
maxm=1000;
var
n,m,i,j,x,y:longint;
b:array[1..maxn,1..maxn] of boolean;
indegree,c,stack,a,low:array[1..maxn] of longint;
size,time:longint;
function min(a,b:longint):longint;
begin
if a<b then exit(a) else exit(b);
end;
function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end;
procedure swap(a,b:longint);
var
p:longint;
begin
p:=a;
a:=b;
b:=p;
end;
procedure tarjan(k,father{,deep}:longint);
var
i,j:longint;
begin
inc(size);
stack[size]:=k; //for suo_dian^_^
inc(time);
a[k]:=time;
low[k]:=time;
{
low[k]:=deep;
a[k]:=deep;
}
c[k]:=1;
for i:=1 to n do
begin
if (b[i,k]) and (i<>father) and (a[i]<a[k]) then
begin
if c[i]=0 then
begin
tarjan(i,k{,deep+1});
low[k]:=min(low[k],low[i]);
end;
if (c[i]=1) and (i<>father) then
begin
low[k]:=min(low[k],a[i]);
end;
end;
end;
c[k]:=2;
end;
procedure main;
var
i,j,tot:longint;
begin
fillchar(stack,sizeof(stack),0);
fillchar(a,sizeof(a),0);
fillchar(low,sizeof(low),0);
fillchar(c,sizeof(c),0);
fillchar(indegree,sizeof(indegree),0);
size:=0;time:=0;
tarjan(1,0{,1});
for i:=1 to n do
for j:=i+1 to n do
if (low[i]<>low[j]) and (b[i,j]) then
begin
inc(indegree[low[i]]);
inc(indegree[low[j]]);
end;
tot:=0;
for i:=1 to n do if indegree[i]=1 then inc(tot);
writeln((tot+1) div 2);
end;
begin
while not seekeof do
begin
fillchar(b,sizeof(b),false);
read(n,m);
for i:=1 to m do
begin
read(x,y);
b[x,y]:=true;
b[y,x]:=true;
end;
main;
end;
end.