Necklace

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的项链。 

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) 

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

 

Sample Output

 
 
 
   
YES
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 .

转载于:https://www.cnblogs.com/PisntD/archive/2010/11/13/1876630.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值