传送门:>Here<

题意:给出一颗树,节点不是黑色就是白色,每次可以将一个颜色相同的块变颜色,问最少变几次才能让其变为同色

解题思路:

  我们考虑由于每一次都是把同样颜色的色块进行变色,因此同样颜色的色块可以看成一个点。所以我们先将同一个色块缩成一个点。

  然后我们有一个结论,我们最后的答案就是缩点完成的这棵树的直径+1再除以2.

  我们很容易发现,缩点完成以后的树相邻的两个点颜色一定是不同的,否则就能继续缩。因此我们可以每次选择直径中间的那个点,改变它的颜色,然后它就与周围的那些点融合成为一个新的点,然后再找到中间的,继续重复如上步骤。最后我们会发现,恰好是$(dis+1) / 2$次。这个证明不是很严谨,不过感性地理解一下吧

Code

  细节不多

/*by DennyQi*/
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#define  r  read()
#define  Max(a,b)  (((a)>(b))?(a):(b))
#define  Min(a,b)  (((a)<(b))?(a):(b))
using namespace std;
typedef long long ll;
;
const int INF = 0x3f3f3f3f;
;
inline int read(){
    ; ; register unsigned char c = getchar();
    '); c = getchar());
    , c = getchar();
    ) + (x<<) + c - ';
    return x * w;
}
int N,cur_num;
int color[MAXN],nod[MAXN],x[MAXN],y[MAXN],d[MAXN],vis[MAXN];
vector <int> g[MAXN],G[MAXN];
queue <int> q;
inline void add(int u, int v){
    g[u].push_back(v);
}
inline void Add(int u, int v){
    G[u].push_back(v);
}
void dfs(int u){
    int sz = g[u].size(),v;
    nod[u] = cur_num;
    ; i < sz; ++i){
        v = g[u][i];
        if(!nod[v] && (color[v] == color[u])){
            dfs(v);
        }
    }
}
inline void BFS(int s){
    memset(d, 0x3f, sizeof(d));
    memset(vis,,sizeof(vis));
    d[s] = ;
    q.push(s);
    vis[s] = ;
    int u,sz,v;
    while(!q.empty()){
        u = q.front();q.pop();
        sz = G[u].size();
        ; i < sz; ++i){
            v = G[u][i];
            if(!vis[v]){
                vis[v] = ;
                d[v] = d[u] + ;
                q.push(v);
            }
        }
    }
}
int main(){
//    freopen(".in","r",stdin);
    N=r;
    ; i <= N; ++i){
        color[i]=r;
    }
    ; i < N; ++i){
        x[i]=r,y[i]=r;
        add(x[i], y[i]);
        add(y[i], x[i]);
    }
    ; i <= N; ++i){
        if(!nod[i]){
            ++cur_num;
            dfs(i);
        }
    }
    ; i < N; ++i){
        if(nod[x[i]] != nod[y[i]]){
            Add(nod[x[i]], nod[y[i]]);
            Add(nod[y[i]], nod[x[i]]);
        }
    }
/*    for(int i = 1; i <= cur_num; ++i){
        printf("%d: ", i);
        for(int j = 0; j < G[i].size(); ++j){
            printf("%d,",G[i][j]);
        }
        printf("\n");
    }*/
    BFS();
    ,p;
    ; i <= cur_num; ++i){
        if(d[i] > _max){
            _max = d[i];
            p = i;
        }
    }
/*    printf("p = %d\n", p);
    for(int i = 1; i <= cur_num; ++i){
        printf("%d ",d[i]);
    }
    printf("\n");*/
    BFS(p);
    _max = -;
    ; i <= cur_num; ++i){
        if(d[i] > _max){
            _max = d[i];
        }
    }
/*    for(int i = 1; i <= cur_num; ++i){
        printf("%d ",d[i]);
    }
    printf("\n");
    printf("_max = %d\n", _max);*/
    printf()/);
    ;
}

Codeforces734 E. Anton and Tree的更多相关文章

  1. Codeforces 734E. Anton and Tree 搜索

    E. Anton and Tree time limit per test: 3 seconds memory limit per test :256 megabytes input:standard ...

  2. Codeforces Round #379 (Div. 2) E. Anton and Tree 缩点 直径

    E. Anton and Tree 题目连接: http://codeforces.com/contest/734/problem/E Description Anton is growing a t ...

  3. Codeforces Round #379 (Div. 2) E. Anton and Tree 树的直径

    E. Anton and Tree time limit per test 3 seconds memory limit per test 256 megabytes input standard i ...

  4. Anton and Tree

    Anton and Tree 题目链接:http://codeforces.com/contest/734/problem/E DFS/BFS 每一次操作都可以使连通的结点变色,所以可以将连通的点缩成 ...

  5. Codeforces 734E Anton and Tree(缩点+树的直径)

    题目链接: Anton and Tree 题意:给出一棵树由0和1构成,一次操作可以将树上一块相同的数字转换为另一个(0->1 , 1->0),求最少几次操作可以把这棵数转化为只有一个数字 ...

  6. Codeforces Round #379 (Div. 2) E. Anton and Tree —— 缩点 + 树上最长路

    题目链接:http://codeforces.com/contest/734/problem/E E. Anton and Tree time limit per test 3 seconds mem ...

  7. 【27.91%】【codeforces 734E】Anton and Tree

    time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  8. Codeforces Round #379 (Div. 2) E. Anton and Tree

    题意: 给一颗树 每个节点有黑白2色 可以使一个色块同事变色,问最少的变色次数. 思路: 先缩点 把一样颜色的相邻点 缩成一个 然后新的树 刚好每一层是一个颜色. 最后的答案就是树的直径/2 不过我用 ...

  9. cf734 E. Anton and Tree

    这个题的题意还是很劲的.搞了好久才知道是怎么变得. (假设已经缩好了点,每次边中间颜色不同的,然后和就和他外面的相同,继续再变这个大的,依次类推,最多就是树的直径D/2) (还是英语水平太弱了(吐槽+ ...

随机推荐

  1. POJ3648 A Simple Problem with Integers(线段树之成段更新。入门题)

    A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 53169 Acc ...

  2. XSS的DOS攻击之 server limit dos

    墨西哥同学周末很郁闷的在宾馆上网,发现youtube被ban了,于是写个了tool解决这个问题.顺带想到了一种利用 google 统计的漏洞,写在这里了 http://sirdarckcat.blog ...

  3. pv ticketlock解决虚拟环境下的spinlock问题

    最近看邮件,有注意到pv ticketlock相关的消息,貌似jeremy 几年前的东东,终于将要被收录到linux 3.12里面. 先说下pv ticketlock这东西,http://blog.x ...

  4. C# 事务之SqlTransaction

    private static void Execute(string connectionString) { using (SqlConnection connection = new SqlConn ...

  5. 篇2 安卓app自动化测试-初识python调用appium

    篇2              安卓app自动化测试-初识python调用appium --lamecho辣么丑 1.1概要 大家好!我是lamecho(辣么丑),上一篇也是<安卓app自动化测 ...

  6. (转)Spring boot——logback.xml 配置详解(三)&lt;appender&gt;

    文章转载自:http://aub.iteye.com/blog/1101260,在此对作者的辛苦表示感谢! 1 appender <appender>是<configuration& ...

  7. 小白的Python之路 day5 random模块和string模块详解

    random模块详解 一.概述 首先我们看到这个单词是随机的意思,他在python中的主要用于一些随机数,或者需要写一些随机数的代码,下面我们就来整理他的一些用法 二.常用方法 1. random.r ...

  8. Couchbase入门——环境搭建以及HelloWorld

    一.引言 NoSQL(Not Only SQL),火了很久了,一直没空研究.最近手上一个项目对Cache有一定的要求,借此机会对NoSQL入门一下.支持NoSQL的数据库系统有很多,  比如Redis ...

  9. LOJ116 有源汇有上下界最大流(上下界网络流)

    考虑有源汇上下界可行流:由汇向源连inf边,那么变成无源汇图,按上题做法跑出可行流.此时该inf边的流量即为原图中该可行流的流量.因为可以假装把加上去的那些边的流量放回原图. 此时再从原来的源向原来的 ...

  10. Android通讯录管理(获取联系人、通话记录、短信消息)

    前言:前阵子主要是记录了如何对联系人的一些操作,比如搜索,全选.反选和删除等在实际开发中可能需要实现的功能,本篇博客是小巫从一个别人开源的一个项目抽取出来的部分内容,把它给简化出来,可以让需要的朋友清 ...