博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #395 (Div. 2) - C
阅读量:6435 次
发布时间:2019-06-23

本文共 2074 字,大约阅读时间需要 6 分钟。

 

题目链接:http://codeforces.com/contest/764/problem/C

题意:给定一个n个点n-1条边的树,然后树上每一个点都有一个颜色。现在问你能不能删除一个点是个删除这个点之后所新产生的多棵中每棵树中点的颜色都一样。如果存在合法的删除点输出YES和该点。否则输出NO。

思路:起初我暴力枚举删除n个点然后判断发现tle了。 考虑下题目要求删除后新产生的多棵树中每个点的颜色要一致,那么我们只要枚举输入的边发现边对应的两个点的颜色不一样那么肯定要删除其中一个点,因为假设点x和点y颜色不一样并且有一边x-y的边,那么不删除x/y的话,新产生的多棵树中x和y一定在同一棵树上,因为x-y有边而且你只能删除一个点并且的删除的点不是x和y,那么x和y在同个树上。所以只需枚举两个点即可。 注意有一种情况就是输入的所有边的两个点颜色都一样,这种情况随便删除哪个点都是合法的。

#define _CRT_SECURE_NO_DEPRECATE#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define x first#define y second#define pb push_back#define mp make_pairtypedef long long int LL;const int inf = 0x3f3f3f3f;const LL INF = 0x3f3f3f3f3f3f3f3fLL;const int MAXN = 1e5 + 10;int c[MAXN];bool flag;vector
G[MAXN];void dfs(int u, int fa, int col){ if (!flag){ return; } for (int i = 0; i < G[u].size(); i++){ if (G[u][i] != fa){ if (c[G[u][i]] != col){ flag = false; } else{ dfs(G[u][i], u, col); } } }}int solve(int x){ flag = true; for (int i = 0; i < G[x].size()&&flag; i++){ dfs(G[x][i], x, c[G[x][i]]); } if (flag){ return x; } else{ return -1; }}int main(){//#ifdef kirito// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);//#endif// int start = clock(); int n; while (~scanf("%d", &n)){ for (int i = 0; i <= n; i++){ G[i].clear(); } for (int i = 1; i < n; i++){ int u, v; scanf("%d%d", &u, &v); G[u].push_back(v); G[v].push_back(u); } for (int i = 1; i <= n; i++){ scanf("%d", &c[i]); } int ans = -1; bool k = false; for (int i = 1; i <= n&&k==false; i++){ for (int j = 0; j < G[i].size(); j++){ if (c[i] != c[G[i][j]]){ //有边并且颜色不一样 ans = solve(i); if (ans == -1){ ans = solve(G[i][j]); } k = true; break; } } } if (k == false){ ans = 1; } if (ans != -1){ printf("YES\n%d\n", ans); } else{ printf("NO\n"); } }//#ifdef LOCAL_TIME// cout << "[Finished in " << clock() - start << " ms]" << endl;//#endif return 0;}

 

转载于:https://www.cnblogs.com/kirito520/p/6363522.html

你可能感兴趣的文章
js实现在表格中删除和添加一行
查看>>
SOCKET简单爬虫实现代码和使用方法
查看>>
跨域解决方案汇总
查看>>
In App Purchase
查看>>
js判断对象的类型的四种方式
查看>>
RPC框架的可靠性设计
查看>>
使用自选择创建团队
查看>>
基准测试(Benchmarks)不必消亡
查看>>
ceph 常用命令记录(完善中...)
查看>>
C# 7.3新特性一览
查看>>
用Chrome开发者工具调试一切
查看>>
简易mvvm库的设计实现
查看>>
AppDynamics把业务交易跟踪扩展到SAP环境
查看>>
[Three.js]Three.js中文文档-自定义混合方程常数
查看>>
Kafka 处理器客户端介绍
查看>>
通过分析这段代码的进化历程,或许能够加深您对JavaScript的作用域的理解
查看>>
创建对象(一):创建与继承
查看>>
深入浅出vue1.0:Vue 实例
查看>>
XML 实体扩展攻击
查看>>
浅谈 OneAPM 在 express 项目中的实践
查看>>