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 }

 

 

 

posted @ 2013-03-13 00:10  proverbs  阅读(309)  评论(0编辑  收藏  举报