【DFS】【贪心】Codeforces Round #411 (Div. 1) C. Ice cream coloring
对那个树进行dfs,在动态维护那个当前的冰激凌集合的时候,显然某种冰激凌仅会进出集合各一次(因为在树上形成连通块)。
于是显然可以对当前的冰激凌集合贪心染色。暴力去维护即可。具体实现看代码。map不必要。
#include<cstdio> #include<set> #include<vector> #include<map> #include<algorithm> using namespace std; map<int,bool>tag; int v[600010],next[600010],first[300010],e; void AddEdge(int U,int V){ v[++e]=V; next[e]=first[U]; first[U]=e; } vector<int>ice[300010]; int n,m,col[300010],ans=1; bool vis[300010]; void dfs(int U){ tag.clear(); for(int i=0;i<ice[U].size();++i){ if(col[ice[U][i]]){ tag[col[ice[U][i]]]=1; } } int k=1; for(int i=0;i<ice[U].size();++i){ if(!col[ice[U][i]]){ while(tag[k]){ ++k; } col[ice[U][i]]=k; tag[k]=1; ans=max(ans,k); } } vis[U]=1; for(int i=first[U];i;i=next[i]){ if(!vis[v[i]]){ dfs(v[i]); } } } int main(){ // freopen("c.in","r",stdin); int x,y; scanf("%d%d",&n,&m); for(int i=1;i<=n;++i){ scanf("%d",&x); for(int j=1;j<=x;++j){ scanf("%d",&y); ice[i].push_back(y); } } for(int i=1;i<n;++i){ scanf("%d%d",&x,&y); AddEdge(x,y); AddEdge(y,x); } dfs(1); printf("%d\n",ans); for(int i=1;i<m;++i){ printf("%d ",col[i]==0 ? 1 : col[i]); } printf("%d\n",col[m]==0 ? 1 : col[m]); return 0; }
——The Solution By AutSky_JadeK From UESTC
转载请注明出处:http://www.cnblogs.com/autsky-jadek/