内容目录
这题做了半天……结果发现自己缩点错了……
言归正传,这题给了一个无向图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.