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 }
没有人能阻止我前进的步伐,除了我自己!