CodeForces - 763A(并查集/思维)
题意
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(并查集/思维)的更多相关文章
- Codeforces 722C(并查集 + 思维)
本文链接:http://www.cnblogs.com/Ash-ly/p/5932712.html 题目链接:http://codeforces.com/problemset/problem/722/ ...
- [codeforces 859 E] Desk Disorder 解题报告 (并查集+思维)
题目链接:http://codeforces.com/problemset/problem/859/E 题目大意: 有$n$个人,$2n$个座位. 给出这$n$个人初始的座位,和他们想坐的座位. 每个 ...
- Codeforces Round #600 (Div. 2) D题【并查集+思维】
题意:给你n个点,m条边,然后让你使得这个这个图成为一个协和图,需要加几条边.协和图就是,如果两个点之间有一条边,那么左端点与这之间任意一个点之间都要有条边. 思路:通过并查集不断维护连通量的最大编号 ...
- Codeforces 980 并查集/模拟贪心最小字典序 找规律/数去除完全平方因子 逆思维倍增预处理祖先标记点
A /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define pb push_bac ...
- Vladik and Entertaining Flags CodeForces - 811E (并查集,线段树)
用线段树维护每一块左右两侧的并查集, 同色合并时若不连通则连通块数-1, 否则不变 #include <iostream> #include <algorithm> #incl ...
- F - Number of Connected Components UVALive - 7638 (并查集 + 思维)
题目链接:https://cn.vjudge.net/contest/275589#problem/F 题目大意:就是给你n个数,如果说两个数之间的gcd!=1,那么就将这两个点连起来,问你最终这些点 ...
- CodeForces - 893C-Rumor(并查集变式)
Vova promised himself that he would never play computer games... But recently Firestorm - a well-kno ...
- 并查集+思维——The Door Problem
一.问题描述(题目链接) 有n个门和m个开关,每个开关可以控制任意多的门,每个门严格的只有两个开关控制,问能否通过操作某些开关使得所有门都打开.(给出门的初始状态). 二.问题分析 大部分开关问题首先 ...
- 并查集+思维——X-Plosives
一.问题描述(题目链接) 有n种化合物,每种化合物由两种元素组成.当几种的化合物数量等于他们所含不同元素的数量时,就会发生爆炸.现在依次给出化合物的组成,当新的化合物与之前的化合物放在一起会发生爆炸时 ...
随机推荐
- <离散数学>代数系统——群,半群
------运算的定义及性质 设S是一个非空集合,映射f:Sn->S称为S上的一个n元运算.假设“•”是定义在集合S上的一个二元运算.若: ∀x,y∈S,x•y∈S,则称“•”在S上是封闭的. ...
- 破解另一家网站的反爬机制 & HMAC 算法
零.写在前面 本文涉及的反爬技术,仅供个人技术学习,禁止并做到: 干扰被访问网站的正常运行 抓取受到法律保护的特定类型的数据或信息 搜集到的数据禁止传播.交给第三方使用.或者牟利 如有可能,在爬到数据 ...
- (一)初识NumPy库(数组的创建和变换)
在学习数据分析时,NumPy作为最基础的数据分析库,我们能够熟练的掌握它是学习数据分析的必要条件.接下来就让我们学习该库吧. 学习NumPy库的环境: python:3.6.6 编辑器:pycharm ...
- GitLab-怎样使用GitLab托管项目
场景 Docker Compose部署GitLab服务,搭建自己的代码托管平台(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...
- Hello universe!
Hello, universe. This is my first cnblogs article.this blog apply to computer technology and another ...
- CODING 2.0:为什么我们需要 DevOps
CODING 在前两天的 Kubecon 2019 大会上发布了 CODING 2.0.这背后是 CODING 对研发管理和研发团队组建的思考.从 CODING 成立以来,我们一直在探索"让 ...
- PWA 学习笔记(一)
PWA 介绍 概念: PWA(Progressive web apps,渐进式 Web 应用)运用现代 Web API 和传统的渐进式增强策略来创建跨平台 Web 应用程序 它并不是一个快捷方式,而能 ...
- 微信 PC HOOK
一.概述 Web端有开源代码,但新用户登录不了 PC端也有开源代码,新老用户都能登录 市场上已有的产品:发卡机器人.多群转发机器人.营销管理机器人 基本的功能:收发消息,加人加群,收账抢红包 二.原理 ...
- libwebrtc & libmediasoupclient编译
本文简单介绍在Ubuntu下libwebrtc的编译过程. 由于网速限制,实际编译过程是在远程vps上编译滴. 系统环境 Ubuntu 18.04系统的虚拟主机. root@vultr:~# pwd ...
- TP5 where多条件查询
引用 : https://blog.csdn.net/haibo0668/article/details/78203170/