2013-09-08 10:00
var m, n :longint; t :longint; f, last : array [ 0 .. 20100 ] of longint; pre, other : array [ 0 .. 160100 ] of longint; l, time :longint; dfn, low : array [ 0 .. 20100 ] of longint; tot :longint; stack : array [ 0 .. 20100 ] of longint; flag, fs : array [ 0 .. 20100 ] of boolean; i :longint; key : array [ 0 .. 20100 ] of longint; kk :longint; que : array [ 0 .. 20100 ] of longint; count :longint; function min(a,b:longint):longint; begin if a>b then min:=b else min:= a; end ; procedure connect(x,y:longint); begin inc(l); pre[l]: = last[x]; last[x]: = l; other[l]: = y; f[y]: = x; end ; procedure init; var i :longint; x, y :longint; begin read(n,m); for i:= 1 to m do begin read(x,y); connect(x,y); end ; end ; procedure dfs(x:longint); var p, q, cur :longint; begin inc(time); dfn[x]: = time; low[x]: = time; inc(tot); stack[tot]: = x; fs[x]: = true; flag[x]: = true; q: = last[x]; while q<> 0 do begin p: = other[q]; if p<>x then begin if not flag[p] then begin dfs(p); low[x]: = min(low[x],low[p]); end else if fs[p] then begin low[x]: = min(low[x],dfn[p]); end ; end ; q: = pre[q]; end ; p: =- 1 ; if low[x]=dfn[x] then begin inc(kk); while p<>x do begin p: = stack[tot]; fs[p]: = false; key[p]: = kk; dec(tot); inc(count); end ; end ; end ; function bfs(x:longint):boolean; var i :longint; t, h, p, q :longint; cur :longint; d : array [ 0 .. 2020 ] of longint; begin fillchar(flag,sizeof(flag), 0 ); fillchar(d,sizeof(d), 0 ); h: = 0 ; t:= 1 ; que[ 1 ]:= x; d[x]: = 1 ; while h<t do begin inc(h); cur: = que[h]; q: = last[cur]; while q<> 0 do begin p: = other[q]; inc(t); que[t]: = p; d[p]: =d[cur]+ 1 ; q: = pre[q]; end ; end ; if d[que[t]]=kk-n then exit(true) else exit(false); end ; procedure main; var i :longint; x :longint; q, p :longint; begin l: = 1 ; fillchar(last,sizeof(last), 0 ); time: = 0 ; fillchar(f,sizeof(f), 0 ); fillchar(low,sizeof(low), 0 ); fillchar(dfn,sizeof(dfn), 0 ); fillchar(flag,sizeof(flag),false); fillchar(stack,sizeof(stack), 0 ); tot: = 0 ; fillchar(fs,sizeof(fs),false); fillchar(key,sizeof(key), 0 ); count: = 0 ; init; x: = 0 ; kk: = n; for i:= 1 to n do if (f[i]= 0 ) then begin if x<> 0 then begin writeln( ' No ' ); exit; end ; x: = i; end ; if x= 0 then x:= 1 ; dfs(x); if count<>n then begin writeln( ' No ' ); exit; end ; for i:= 1 to n do begin q: = last[i]; while q<> 0 do begin p: = other[q]; if key[i]<>key[p] then connect(key[i],key[p]); q: = pre[q]; end ; end ; x: = 0 ; for i:=n+ 1 to kk do begin if f[i]= 0 then begin if x<> 0 then begin writeln( ' No ' ); exit; end ; x: = i; end ; end ; if x= 0 then x:= 1 ; if bfs(x) then writeln( ' Yes ' ) else writeln( ' No ' ); end ; begin read(t); for i:= 1 to t do main; end .