题意

https://vjudge.net/problem/CodeForces-763A

一棵无根树中各个节点被染上了一种颜色c[i]

现在让你选择一个点作为根节点,使得这个根节点的所有儿子满足以该儿子节点的作为根的子树中所有点颜色均相同(不同儿子为根的子树颜色可以不同)

思路

俺的方法:

暴力水过。用并查集把相同颜色的连了边的点缩点,然后枚举每个点作为答案,判断这个点所连的的所有点的所在相同颜色连通块的大小之和是否等于n-1即可(除去自己这个点)。

正解:

先计算每个点与所连的点的颜色不同的点数,把两端颜色不同的边数也记录。如果某个点与连的点的不同颜色的个数==所有颜色不同的边数,那么这个点就是满足条件的。

这样想,作为根的这个点连的其他连通块肯定每个连通块颜色都是相同的,那么颜色不同的边只能在根这个点产生。

代码

俺的:

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=100005;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
int c[N],pre[N];
vector<int> g[N];
int flag=0;
int find(int x)
{
if(x==pre[x])
return x;
return pre[x]=find(pre[x]);
}
set<int> s[N];
int main()
{
std::ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=1; i<n; i++)
{
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
int q,mx=0;
for(int i=1; i<=n; i++)
{
cin>>c[i];
pre[i]=i;
}
for(int i=1; i<=n; i++)
{
int sz=g[i].size();
for(int j=0; j<sz; j++)
{
if(c[i]==c[g[i][j]])
{
int fi=find(i),fj=find(g[i][j]);
if(fi!=fj)
pre[fj]=fi;
}
}
}
for(int i=1; i<=n; i++)
{
s[find(i)].insert(i);
}
int p,f=0;
for(int i=1; i<=n; i++)
{
int sum=0;
int sz=g[i].size();
for(int j=0; j<sz; j++)
{
int v=g[i][j];
sum+=s[find(v)].size();
}
// cout<<i<<" "<<sum<<endl;
if(s[i].size()!=1)
{
sum--;
}
if(sum==n-1)
{
p=i;
flag=1;
break;
}
}
if(!flag)
cout<<"NO"<<endl;
else
{
cout<<"YES"<<endl;
cout<<p<<endl;
}
return 0;
}
/*
7
1 7
1 3
1 4
4 5
1 2
2 6
3 2 1 2 2 2 2
*/
/*
8
1 4
2 4
3 4
4 8
1 7
2 5
2 6
2 1 8 2 1 1 2 6
*/

  

正解:

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=100005;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
int c[N],s[N],u[N],v[N];
int main()
{
std::ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=1; i<n; i++)
{
cin>>u[i]>>v[i];
}
int q,mx=0;
for(int i=1; i<=n; i++)
{
cin>>c[i];
}
int sum=0;
for(int i=1;i<n;i++)
{
if(c[u[i]]!=c[v[i]])
s[u[i]]++,s[v[i]]++,sum++;
}
for(int i=1;i<=n;i++)
{
if(s[i]==sum)
{
cout<<"YES"<<endl<<i<<endl;
return 0;
}
}
cout<<"NO"<<endl;
return 0;
}

  

CodeForces - 763A(并查集/思维)的更多相关文章

  1. Codeforces 722C(并查集 + 思维)

    本文链接:http://www.cnblogs.com/Ash-ly/p/5932712.html 题目链接:http://codeforces.com/problemset/problem/722/ ...

  2. [codeforces 859 E] Desk Disorder 解题报告 (并查集+思维)

    题目链接:http://codeforces.com/problemset/problem/859/E 题目大意: 有$n$个人,$2n$个座位. 给出这$n$个人初始的座位,和他们想坐的座位. 每个 ...

  3. Codeforces Round #600 (Div. 2) D题【并查集+思维】

    题意:给你n个点,m条边,然后让你使得这个这个图成为一个协和图,需要加几条边.协和图就是,如果两个点之间有一条边,那么左端点与这之间任意一个点之间都要有条边. 思路:通过并查集不断维护连通量的最大编号 ...

  4. Codeforces 980 并查集/模拟贪心最小字典序 找规律/数去除完全平方因子 逆思维倍增预处理祖先标记点

    A /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define pb push_bac ...

  5. Vladik and Entertaining Flags CodeForces - 811E (并查集,线段树)

    用线段树维护每一块左右两侧的并查集, 同色合并时若不连通则连通块数-1, 否则不变 #include <iostream> #include <algorithm> #incl ...

  6. F - Number of Connected Components UVALive - 7638 (并查集 + 思维)

    题目链接:https://cn.vjudge.net/contest/275589#problem/F 题目大意:就是给你n个数,如果说两个数之间的gcd!=1,那么就将这两个点连起来,问你最终这些点 ...

  7. CodeForces - 893C-Rumor(并查集变式)

    Vova promised himself that he would never play computer games... But recently Firestorm - a well-kno ...

  8. 并查集+思维——The Door Problem

    一.问题描述(题目链接) 有n个门和m个开关,每个开关可以控制任意多的门,每个门严格的只有两个开关控制,问能否通过操作某些开关使得所有门都打开.(给出门的初始状态). 二.问题分析 大部分开关问题首先 ...

  9. 并查集+思维——X-Plosives

    一.问题描述(题目链接) 有n种化合物,每种化合物由两种元素组成.当几种的化合物数量等于他们所含不同元素的数量时,就会发生爆炸.现在依次给出化合物的组成,当新的化合物与之前的化合物放在一起会发生爆炸时 ...

随机推荐

  1. 【zabbix部署】基于linux安装zabbix监控服务和被监控服务

    环境配置 zabbix_server:10.0.0.1 zabbix_agentd:10.0.0.1,10.0.0.2(暂定) 操作系统:centos7.6 安装环境配置 1. LNMP环境 zabb ...

  2. Class文件结构-属性表

    一.属性表整体结构 二.属性表具体结构

  3. Cesium专栏-淹没分析(附源码下载)

    Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精度,渲染质量以 ...

  4. 12C新功能:在线移动分区 (Doc ID 1584032.1)

    12C New Feature: Online Move Partition (Doc ID 1584032.1) APPLIES TO: Oracle Database - Enterprise E ...

  5. MVC(实战二:网址映射)

    一.默认网址 Global.asax 默认网址配置: 此时打开编辑页面,效果如下: ?后面包含name参数和Email参数  在Global中修改网址路由: public static void Re ...

  6. Java类BufferedImage

    https://docs.oracle.com/javase/7/docs/api/java/awt/image/BandedSampleModel.html

  7. Python动态网页爬虫-----动态网页真实地址破解原理

    参考链接:Python动态网页爬虫-----动态网页真实地址破解原理

  8. 如何用css实现太极图

    <!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>太 ...

  9. 面试知识点 html css(经常更新)

    1.HTML5语义化 什么是语义化 用合理.正确的标签来展示内容,比如h1~h6定义标题 好处 易于用户阅读,样式丢失的时候能让页面呈现清晰的结构. 有利于SEO,搜索引擎根据标签来确定上下文和各个关 ...

  10. 使用matplotlib.pyplot中plot()绘制折线图

    1.函数形式 plt.plot(x, y, format_string, **kwargs) x轴数据,y轴数据,format_string控制曲线的格式字串(format_string 由颜色字符, ...