ADERA3 省选模拟赛 SPOJ LMCONST

这题zxr神犇当场ak了。。

无限仰慕,用的是zxr神犇的方法,没有Riatre的~

不加通道前时一棵树,然后根据这个再树上贪心就好了,反正我是没想到。。。

 

View Code
 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cstdlib>

 4 #include <cstring>

 5 #include <algorithm>

 6 

 7 #define N 111111

 8 #define M 555555

 9 

10 using namespace std;

11 

12 int n,m,q,st,ed,cnt;

13 int head[N],next[M],to[M];

14 int out[N],outs[N],in[N],ins[N],c[N];

15 bool fg;

16 

17 inline void add(int u,int v)

18 {

19     to[cnt]=v; next[cnt]=head[u]; head[u]=cnt++;

20 }

21 

22 inline void read()

23 {

24     scanf("%d%d%d",&n,&m,&q);

25     cnt=0;

26     for(int i=0;i<=n;i++)

27     {

28         in[i]=out[i]=c[i]=0;

29         head[i]=-1;

30     }

31     scanf("%d%d",&st,&ed); st++,ed++;

32     outs[ed]=st; ins[st]=ed;

33     in[st]++; out[ed]++;

34     for(int i=1,a,b;i<=m;i++)

35     {

36         scanf("%d%d",&a,&b); a++,b++;

37         add(a,b); add(b,a);

38     }

39     for(int i=1,a,b;i<=q;i++)

40     {

41         scanf("%d%d",&a,&b); a++,b++;

42         outs[a]=b; ins[b]=a;

43         out[a]++; in[b]++;

44     }

45 }

46 

47 inline void dfs(int u,int fa)

48 {

49     if(!fg) return;

50     for(int i=head[u];~i;i=next[i])

51     {

52         if(to[i]==fa) continue;

53         dfs(to[i],u);

54         if(c[to[i]]==1)

55         {

56             outs[to[i]]=u; ins[u]=to[i];

57             out[to[i]]++; in[u]++;

58         }

59         else if(c[to[i]]==-1)

60         {

61             outs[u]=to[i]; ins[to[i]]=u;

62             out[u]++; in[to[i]]++;

63         }

64     }

65     if(in[u]>1||out[u]>1) {fg=false;return;}

66     c[u]=in[u]-out[u];

67 }

68 

69 inline void go()

70 {

71     for(int i=1;i<=n;i++)

72         if(in[i]>1||out[i]>1) {puts("IMPOSSIBLE");return;}

73     fg=true;

74     dfs(1,-1);

75     

76     if(!fg||c[1]!=0) {puts("IMPOSSIBLE");return;}

77     for(int i=1;i<=n;i++)

78         if(out[i]!=0)

79         {

80             out[i]--; in[outs[i]]--;

81             for(int j=outs[i];j!=i;j=outs[j]) out[j]--,in[outs[j]]--;

82             break;

83         }

84     

85     for(int i=1;i<=n;i++)

86         if(out[i]!=0) {puts("IMPOSSIBLE");return;}

87     puts("POSSIBLE");

88 }

89 

90 int main()

91 {

92     int cas; scanf("%d",&cas);

93     while(cas--) read(),go();

94     return 0;

95 }

 

 

 

你可能感兴趣的:(Const)