分析转载自http://blog.csdn.net/yukizzz/article/details/51029628
题意:
给定n个点和m条双向边,将双向边改为单向边,问无法到达的顶点最少有多少个?
分析:
无法到达的话即入度为0。
DFS判断每一个连通块中是否存在环,如果存在环,就能保证环中每个点的入度都大于等于1。否则,有头有尾,头的入度为0。
1 var head,vet,next,flag:array[1..200000]of longint; 2 n,m,x,y,tmp,ans,tot,i:longint; 3 4 procedure add(a,b:longint); 5 begin 6 inc(tot); 7 next[tot]:=head[a]; 8 vet[tot]:=b; 9 head[a]:=tot; 10 end; 11 12 procedure dfs(u,pre:longint); 13 var e,v:longint; 14 begin 15 if flag[u]=1 then begin tmp:=0; exit; end; 16 flag[u]:=1; 17 e:=head[u]; 18 while e<>0 do 19 begin 20 v:=vet[e]; 21 if v<>pre then dfs(v,u); 22 e:=next[e]; 23 end; 24 end; 25 26 begin 27 // assign(input,‘1.in‘); reset(input); 28 //assign(output,‘1.out‘); rewrite(output); 29 readln(n,m); 30 for i:=1 to m do 31 begin 32 read(x,y); 33 add(x,y); 34 add(y,x); 35 end; 36 for i:=1 to n do 37 if flag[i]=0 then 38 begin 39 tmp:=1; 40 dfs(i,0); 41 ans:=ans+tmp; 42 end; 43 writeln(ans); 44 // close(input); 45 //close(output); 46 end.
时间: 2024-10-10 14:59:39