zoukankan      html  css  js  c++  java
  • 【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
    ",ans);
    	for(int i=1;i<m;++i){
    		printf("%d ",col[i]==0 ? 1 : col[i]);
    	}
    	printf("%d
    ",col[m]==0 ? 1 : col[m]);
    	return 0;
    }
  • 相关阅读:
    python---模块与包
    python---迭代器与生成器
    python---装饰器
    Python---函数
    Python---文件操作
    Python---数据类型
    浅谈UBUNTU
    java 键盘输入多种方法
    动态规划解最长公共子序列问题
    线段树
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/6815500.html
Copyright © 2011-2022 走看看