zoukankan      html  css  js  c++  java
  • Paint the Tree

    Paint the Tree

    题目来源:

    Moscow Pre-Finals Workshop 2018 Day 5 C

    题目大意:

    一棵(n(nle2000))个点的树,有(m(2<m<n))种颜料,为每个结点涂色,希望让最近的同色点对距离最远。问最远距离是多少,此时有多少种涂色方案。

    思路:

    二分答案(k),用BFS序枚举点对,若距离(<k)则说明这两个点一定是不同颜色。

    时间复杂度(mathcal O(n^2log n))

    源代码:

    #include<cstdio>
    #include<cctype>
    #include<vector>
    inline int getint() {
    	register char ch;
    	while(!isdigit(ch=getchar()));
    	register int x=ch^'0';
    	while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
    	return x;
    }
    const int N=2001,mod=1e9+7;
    bool vis[N];
    int n,m,dis[N][N],q[N];
    std::vector<int> e[N];
    inline void add_edge(const int &u,const int &v) {
    	e[u].push_back(v);
    	e[v].push_back(u);
    }
    void dfs(const int &x,const int &par,int dis[]) {
    	for(auto &y:e[x]) {
    		if(y==par) continue;
    		dis[y]=dis[x]+1;
    		dfs(y,x,dis);
    	}
    }
    inline void bfs() {
    	q[++q[0]]=1;
    	for(register int i=1;i<=n;i++) {
    		const int &x=q[i];
    		vis[x]=true;
    		for(auto &y:e[x]) {
    			if(vis[y]) continue;
    			q[++q[0]]=y;
    		}
    	}
    }
    inline int check(const int &k) {
    	int ans=1;
    	for(register int i=1;i<=n;i++) {
    		int cnt=0;
    		for(register int j=1;j<i;j++) {
    			cnt+=dis[q[i]][q[j]]<k;
    		}
    		if(cnt>m) return 0;
    		ans=1ll*ans*(m-cnt)%mod;
    	}
    	return ans;
    }
    int main() {
    	n=getint(),m=getint();
    	for(register int i=1;i<n;i++) {
    		add_edge(getint(),getint());
    	}
    	for(register int i=1;i<=n;i++) {
    		dfs(i,0,dis[i]);
    	}
    	bfs();
    	int l=1,r=n-1,ans;
    	while(l<=r) {
    		const int mid=(l+r)>>1;
    		int tmp;
    		if(tmp=check(mid)) {
    			l=mid+1;
    			ans=tmp;
    		} else {
    			r=mid-1;
    		}
    	}
    	printf("%d %d
    ",l-1,ans);
    	return 0;
    }
    
  • 相关阅读:
    Ajax XMLHttpRequest对象的三个属性以及open和send方法
    去空格
    绑定事件中 如可控制函数的执行次数
    我之理解---计时器setTimeout 和clearTimeout
    关于border边框重叠颜色设置问题
    YbtOj练习:二分5 飞离地球
    YbtOj练习:二分4 分割矩阵
    YbtOj练习:二分3 攻击法坛
    YbtOj练习:贪心3 最优密码
    YbtOj练习:二分2 最小时间
  • 原文地址:https://www.cnblogs.com/skylee03/p/10059336.html
Copyright © 2011-2022 走看看