[构造] ICPC 2016 Hong Kong A. Colourful Graph
2017-03-30 08:13
459 查看
传送门
给你一个n个点的无向连通图,每个点被染了k个颜色中的一种。
你可以对其进行一些修改,假设i时刻的颜色为cv,i,那么i+1时刻的颜色cv,i+1可以为cv,i或者cu,i,其中 u , v 之间有边相连。
给你初态和终止状态,问你有没有方法在20000步内从初态变成终态。
n≤100
这个步数限制实在放得有点宽啊
先判无解
然后把相同颜色的数量调到一样 具体就是把一个多的变成一个少的
然后考虑一棵生成树 从叶子开始调整 叶子调整完对剩余不相互影响
给你一个n个点的无向连通图,每个点被染了k个颜色中的一种。
你可以对其进行一些修改,假设i时刻的颜色为cv,i,那么i+1时刻的颜色cv,i+1可以为cv,i或者cu,i,其中 u , v 之间有边相连。
给你初态和终止状态,问你有没有方法在20000步内从初态变成终态。
n≤100
这个步数限制实在放得有点宽啊
先判无解
然后把相同颜色的数量调到一样 具体就是把一个多的变成一个少的
然后考虑一棵生成树 从叶子开始调整 叶子调整完对剩余不相互影响
#include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++; } inline void read(int &x){ char c=nc(),b=1; for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1; for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b; } inline void write(int x) { if (!x) return (void) printf("0"); if (x < 0) putchar('-'), x = -x; static short s[12], t; while (x) s[++t] = x % 10, x /= 10; while (t) putchar('0' + s[t--]); } const int N=105; struct edge{ int u,v,next; }G[N*N]; int head ,inum; inline void add(int u,int v,int p){ G[p].u=u; G[p].v=v; G[p].next=head[u]; head[u]=p; } int depth ,fat ,son ; #define V G[p].v inline void dfs(int u,int fa){ fat[u]=fa; depth[u]=depth[fa]+1; for (int p=head[u];p;p=G[p].next) if (!depth[V]) son[u]++,dfs(V,u); } inline int LCA(int u,int v){ while (u!=v) if (depth[u]>depth[v]) u=fat[u]; else v=fat[v]; return u; } int n,m,K; int S ,T ; int cntS ,cntT ; inline void print(){ for (int i=1;i<=n;i++) write(S[i]-1),putchar(' '); putchar('\n'); } int pnt,lst ; inline void doit(int u,int v){ pnt=0; int lca=LCA(u,v); int flag=0; while (u!=lca) lst[++pnt]=u,u=fat[u]; lst[++pnt]=lca; int tmp=pnt; while (v!=lca) lst[++pnt]=v,v=fat[v]; if (tmp<pnt) reverse(lst+tmp+1,lst+pnt+1); } int Q ,l,r; int del ; int main(){ int iu,iv; freopen("t.in","r",stdin); freopen("t.out","w",stdout); read(n); read(m); read(K); for (int i=1;i<=n;i++) read(S[i]),cntS[++S[i]]++; for (int i=1;i<=n;i++) read(T[i]),cntT[++T[i]]++; for (int i=1;i<=m;i++) read(iu),read(iv),add(iu,iv,++inum),add(iv,iu,++inum); dfs(1,0); for (int i=1;i<=K;i++) if (cntT[i] && !cntS[i]) return printf("Impossible\n"),0; print(); while (1){ int s=0,t=0; for (int i=1;i<=K && !s;i++) if (cntS[i]<cntT[i]) s=i; if (!s) break; for (int i=1;i<=K && !t;i++) if (cntS[i]>cntT[i]) t=i; cntS[s]++; cntS[t]--; for (int i=1;i<=n;i++) if (S[i]==s) { s=i; break; } for (int i=1;i<=n;i++) if (S[i]==t) { t=i; break; } doit(s,t); for (int i=1;i<pnt-1;i++) if (S[lst[i]]!=S[lst[i+1]]) swap(S[lst[i]],S[lst[i+1]]),print(); S[lst[pnt]]=S[lst[pnt-1]],print(); } l=r=-1; for (int i=1;i<=n;i++) if (!son[i]) Q[++r]=i; while (l<r){ int u=Q[++l]; if (S[u]!=T[u]){ for (int i=1;i<=n;i++) if (!del[i] && S[i]==T[u]){ doit(i,u); break; } for (int i=1;i<pnt;i++) if (S[lst[i]]!=S[lst[i+1]]) swap(S[lst[i]],S[lst[i+1]]),print(); } del[u]=1; if (!(--son[fat[u]])) Q[++r]=fat[u]; } return 0; }
相关文章推荐
- [构造] ICPC 2016 Hong Kong I. Special Tour
- [笛卡尔树 树形DP] ICPC 2016 Hong Kong G. Scaffolding
- [背包 压位 CDQ分治] ICPC 2016 Hong Kong H. Slim Cut
- 2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest G:Graph (构造,拓扑)
- 【2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest H】【字符串哈希 构造】Hash Code Hacker 构造有相同哈希值的不同字符串
- HDU 5876 Sparse Graph(bfs求解补图中的单源最短路)——2016 ACM/ICPC Asia Regional Dalian Online
- HDU 5874 Friends and Enemies 【构造】 (2016 ACM/ICPC Asia Regional Dalian Online)
- 2016 ICPC 大连网络赛 HDU 5876 Sparse Graph
- [2016ICPC 大连网络预选赛] HDU5874 构造
- HDU 5874 Friends and Enemies 【构造】 (2016 ACM/ICPC Asia Regional Dalian Online)
- HDU 5876 Sparse Graph(2016 ACM/ICPC Asia Regional Dalian Online)
- Problem D Curious Cupid from 2016 Asia Hong Kong Online Preliminary 莫队
- Hong Kong Regional Contest 2016 [Kattis - taboo]
- 2016 ACMICPC Asia Regional Dalian Online 1009 Sparse Graph
- 【2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest H】【观察找规律 脑洞 构造】Tourist Guide 关键点作端点最多路径
- 2016 ACM/ICPC Asia Regional Qingdao Online hdu 5881 Tea (模拟构造)★
- 2016 ACM/ICPC Asia Regional Dalian Online Sparse Graph(BFS)
- Asia Hong Kong Regional Contest 2016 F Playing with Numbers(Kattis Playing with Numbers)
- 【2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest B】【构造】Black and White 构造棋盘使得两种棋子联通块数恰为x与y
- 2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest D:Distribution in Metagonia(构造)