内容目录
题目大意:求带重边的连通图至少加几条边变成双连通图
POJ 3352
+重边
用邻接矩阵的表示无压力
Program P3177; const maxn=1000; maxm=1000; var n,m,i,j,x,y:longint; b:array[1..maxn,1..maxn] of boolean; indegree,c,a,low:array[1..maxn] of longint; 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 tarjan(k,father:longint); var i,j:longint; begin inc(time); a[k]:=time; low[k]:=time; 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); 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(a,sizeof(a),0); fillchar(low,sizeof(low),0); fillchar(c,sizeof(c),0); fillchar(indegree,sizeof(indegree),0); time:=0; tarjan(1,0); 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 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.