CF566E Restoring Map
Posted scx117
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF566E Restoring Map相关的知识,希望对你有一定的参考价值。
题意:
标程:
1 #include<bits/stdc++.h> 2 #define P pair<int,int> 3 #define fir first 4 #define sec second 5 using namespace std; 6 const int N=1005; 7 vector<P> vec[N]; 8 bitset<N> bit[N]; 9 int n,f[2*N],x,u,v,k; 10 int find(int x){return x==f[x]?x:f[x]=find(f[x]);} 11 void merge(int x,int y){f[find(x)]=find(y);} 12 int main() 13 { 14 scanf("%d",&n); 15 for (int i=1;i<=n;i++) 16 { 17 scanf("%d",&k); 18 while (k--) scanf("%d",&x),bit[x][i]=1; 19 } 20 if (n==2) return puts("1 2"),0; 21 for (int i=1;i<=2*n;i++) f[i]=i; 22 for (int i=1;i<=n;i++) 23 for (int j=i+1;j<=n;j++) 24 { 25 int cnt=(int)(bit[i]&bit[j]).count(); 26 if (cnt==1) merge(i,j),merge(i+n,j+n); 27 else if (cnt==2) merge(i+n,j),merge(i,j+n); 28 else vec[cnt].push_back(P(i,j)); 29 } 30 if (vec[n].size()==n*(n-1)/2)//特判星 31 { 32 for (int i=2;i<=n;i++) printf("1 %d ",i); 33 return 0; 34 } 35 if (vec[n].size()==1)//特判流星锤 36 { 37 printf("%d %d ",u=vec[n][0].fir,v=vec[n][0].sec); 38 for (int i=1;i<=n;i++) 39 if (i!=u&&i!=v) {merge(i,u),merge(i+n,u+n),merge(i+n,v),merge(i,v+n);break;} 40 for (int i=1;i<=n;i++) 41 if (i!=u&&i!=v) 42 if (find(i)==find(u)) printf("%d %d ",i,u);else printf("%d %d ",i,v); 43 return 0; 44 } 45 for (int i=n;i>=3;i--) 46 for (int j=0;j<vec[i].size();j++) 47 if (u=vec[i][j].fir,v=vec[i][j].sec,find(u)!=find(v)) 48 { 49 printf("%d %d ",u,v); 50 merge(u+n,v);merge(u,v+n); 51 } 52 return 0; 53 }
注意有很多特判:n=2,星星图,流星锤图(后两个由于不满足贪心)。
题解:贪心+染色
以上是关于CF566E Restoring Map的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #353 (Div. 2) B. Restoring Painting __ map or set 思维题