Description
一个无向图中的项链,是由一系列圈组成,C1,C2,……,Ck(K>=1),并且符合如下规定:
1.任何两个圈都没有公共边;
2.任意两个相邻的圈有且仅有一个公共点;
3.任意两个不相邻的圈没有公共点。
4.任意一个点,至多只能出现在一个圈中一次。
现在要求一个从S到T的项链,C1,C2,……,Ck(K>=1),其中S属于C1,T属于Ck。
给定一个无向图,以及两个点S和T,问是否存在从S到T的项链。
1.任何两个圈都没有公共边;
2.任意两个相邻的圈有且仅有一个公共点;
3.任意两个不相邻的圈没有公共点。
4.任意一个点,至多只能出现在一个圈中一次。
现在要求一个从S到T的项链,C1,C2,……,Ck(K>=1),其中S属于C1,T属于Ck。
给定一个无向图,以及两个点S和T,问是否存在从S到T的项链。
Input
第一行一个整数Case(Case<=10)表示测试数据组数。
每组测试数据第一行两个整数N,M N (2<=N<=10, 000) (1<=M<=100, 000)分别表示无向图中点的数目和边的数目。
接下来M行,每行两个整数A和B(1<=A B<=N,A不等于B)表示有一条无向边从A到B。
最后两个整数S和T(1<=S T<=N,S不等于T)
每组测试数据第一行两个整数N,M N (2<=N<=10, 000) (1<=M<=100, 000)分别表示无向图中点的数目和边的数目。
接下来M行,每行两个整数A和B(1<=A B<=N,A不等于B)表示有一条无向边从A到B。
最后两个整数S和T(1<=S T<=N,S不等于T)
Output
共Case行,输出”YES”或”No”,表示是否存在从S到T的项链。
Sample Input
3
3 3
1 2
2 3
3 1
1 3
4 5
1 2
2 3
1 3
3 4
3 4
1 4
4 5
1 2
1 2
2 3
3 4
3 4
1 4
3 3
1 2
2 3
3 1
1 3
4 5
1 2
2 3
1 3
3 4
3 4
1 4
4 5
1 2
1 2
2 3
3 4
3 4
1 4
Sample Output
YES
YES
NO
YES
NO
1
var
2 now,start,d,vd: array [ 0 .. 10000 ] of longint;
3 next,st,c,g,f: array [ 1 .. 200000 ] of longint;
4 flow,ans,i,j,s,t,n,m,times,cs:longint;
5 procedure make(a,b:longint);
6 begin
7 if start[a] = 0 then start[a]: = j
8 else next[now[a]]: = j;
9 now[a]: = j;
10 st[j]: = b;
11 c[j]: = 1 ;
12 g[j]: = 1 ;
13 f[j]: = 0 ;
14 end ;
15 function dfs(u,flow:longint):longint;
16 var
17 v,other,j,tmp:longint;
18 function min(a,b:longint):longint;
19 begin
20 if a < b then min: = a
21 else min: = b;
22 end ;
23 begin
24 if u = t then exit(flow);
25 dfs: = 0 ;
26 j: = start[u];
27 while j <> 0 do
28 begin
29 v: = st[j];
30 if (g[j] > 0 ) and (d[u] = d[v] + 1 ) then
31 begin
32 other: = j + ord(odd(j)) * 2 - 1 ;
33 tmp: = dfs(v,min(flow - dfs,g[j]));
34 dec(g[j],tmp);
35 inc(g[other],tmp);
36 if c[j] > 0 then inc(f[j],tmp) else dec(f[other],tmp);
37 inc(dfs,tmp);
38 if dfs = flow then exit(flow);
39 end ;
40 j: = next[j];
41 end ;
42 if d[s] >= n then exit;
43 dec(vd[d[u]]);
44 if vd[d[u]] = 0 then d[s]: = n;
45 inc(d[u]);
46 inc(vd[d[u]]);
47 end ;
48 begin
49 readln(times);
50 for cs: = 1 to times do
51 begin
52 readln(n,m);
53 fillchar(d,sizeof(d), 0 );
54 fillchar(vd,sizeof(vd), 0 );
55 fillchar(start,sizeof(start), 0 );
56 fillchar(next,sizeof(next), 0 );
57 fillchar(now,sizeof(now), 0 );
58 for i: = 1 to m do
59 begin
60 readln(s,t);
61 j: = i * 2 - 1 ;
62 make(s,t);
63 j: = i * 2 ;
64 make(t,s);
65 end ;
66 readln(s,t);
67 vd[ 0 ]: = n;
68 ans: = 0 ;
69 while d[s] < n do
70 begin
71 flow: = dfs(s,maxlongint);
72 ans: = ans + flow;
73 end ;
74 if ans >= 2 then writeln( ' YES ' )
75 else writeln( ' NO ' );
76 end ;
77 end .
2 now,start,d,vd: array [ 0 .. 10000 ] of longint;
3 next,st,c,g,f: array [ 1 .. 200000 ] of longint;
4 flow,ans,i,j,s,t,n,m,times,cs:longint;
5 procedure make(a,b:longint);
6 begin
7 if start[a] = 0 then start[a]: = j
8 else next[now[a]]: = j;
9 now[a]: = j;
10 st[j]: = b;
11 c[j]: = 1 ;
12 g[j]: = 1 ;
13 f[j]: = 0 ;
14 end ;
15 function dfs(u,flow:longint):longint;
16 var
17 v,other,j,tmp:longint;
18 function min(a,b:longint):longint;
19 begin
20 if a < b then min: = a
21 else min: = b;
22 end ;
23 begin
24 if u = t then exit(flow);
25 dfs: = 0 ;
26 j: = start[u];
27 while j <> 0 do
28 begin
29 v: = st[j];
30 if (g[j] > 0 ) and (d[u] = d[v] + 1 ) then
31 begin
32 other: = j + ord(odd(j)) * 2 - 1 ;
33 tmp: = dfs(v,min(flow - dfs,g[j]));
34 dec(g[j],tmp);
35 inc(g[other],tmp);
36 if c[j] > 0 then inc(f[j],tmp) else dec(f[other],tmp);
37 inc(dfs,tmp);
38 if dfs = flow then exit(flow);
39 end ;
40 j: = next[j];
41 end ;
42 if d[s] >= n then exit;
43 dec(vd[d[u]]);
44 if vd[d[u]] = 0 then d[s]: = n;
45 inc(d[u]);
46 inc(vd[d[u]]);
47 end ;
48 begin
49 readln(times);
50 for cs: = 1 to times do
51 begin
52 readln(n,m);
53 fillchar(d,sizeof(d), 0 );
54 fillchar(vd,sizeof(vd), 0 );
55 fillchar(start,sizeof(start), 0 );
56 fillchar(next,sizeof(next), 0 );
57 fillchar(now,sizeof(now), 0 );
58 for i: = 1 to m do
59 begin
60 readln(s,t);
61 j: = i * 2 - 1 ;
62 make(s,t);
63 j: = i * 2 ;
64 make(t,s);
65 end ;
66 readln(s,t);
67 vd[ 0 ]: = n;
68 ans: = 0 ;
69 while d[s] < n do
70 begin
71 flow: = dfs(s,maxlongint);
72 ans: = ans + flow;
73 end ;
74 if ans >= 2 then writeln( ' YES ' )
75 else writeln( ' NO ' );
76 end ;
77 end .