Codeforces Round #395 C
Timofey and a tree
题意:给一颗树,每个节点有一个颜色c[i],问是否存在一个点,使得去掉这个点后每颗树的颜色只有一种,如果存在,输出这个点
思路:dfs+剪枝做的,如果从结点u->v是可行的(也就是把u删除后v为根的数只有一种颜色)那么标记,之后再次dfs的时候便不需要重新走,如果不可行,也标记起来,同样下次dfs的时候直接返回结果,不需要重新遍历,这样优化后复杂度为O(N) ,A掉之后看了大佬的代码都是直接判断边2端的颜色是不是一样,如果不是一样必然有一个是要删掉的,然后记录颜色不一样的点的度,并且记录这样的点对有多少,删除的点的度数一定是等于这样点对的个数,判断就可以了,当然由于dfs优化的姿势还是要学习一个的,所以我就不贴大佬的代码了,直接贴我自己的dfs吧
AC代码:
#include "iostream" #include "string.h" #include "stack" #include "queue" #include "string" #include "vector" #include "set" #include "map" #include "algorithm" #include "stdio.h" #include "math.h" #define ll long long #define bug(x) cout<<x<<" "<<"UUUUU"<<endl; #define mem(a) memset(a,0,sizeof(a)) #define mp(x,y) make_pair(x,y) #define pb(x) push_back(x) using namespace std; const long long INF = 1e18+1LL; const int inf = 1e9+1e8; const int N=1e5+100; const ll mod=1e9+7;int n,c[N]; vector<int> vex[N]; map<pair<int,int>,int> vis,vis0; map<int,int> M; inline int dfs(int fa, int u, int r){if(c[u]!=r) return 0;for(auto i : vex[u]){if(i==fa || vis[mp(u,i)]) continue;if(vis0[mp(u,i)]){return 0;}if(!dfs(u,i,c[u])){vis0[mp(u,i)]=1;return 0;}else vis[mp(u,i)]=1;}return 1; } void add(int u, int v){vex[u].pb(v);vex[v].pb(u); } int main(){int u,v;ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n;for(int i=1; i<n; ++i){cin>>u>>v;add(u,v);}for(int i=1; i<=n; ++i){cin>>c[i];M[c[i]]++;}int m=M.size();int ans;for(int i=1; i<=n; ++i){ans=i;if(vex[i].size()>=m-1){ //cout<<i<<endl;for(auto j : vex[i]){if(vis[mp(i,j)]) continue;if(!dfs(i,j,c[j])){ans=0;break;}}}else ans=0;if(ans) break;}if(ans){cout<<"YES"<<endl;cout<<ans<<endl;}else cout<<"NO";return 0; }
转载于:https://www.cnblogs.com/max88888888/p/7212160.html
Codeforces Round #395 C相关推荐
- Codeforces Round #395 (Div. 2) - A
题目链接:http://codeforces.com/contest/764/problem/A 题意:有两个人,第一个人每n分钟到达一次目的地,第二个人每m分钟到达一次目的地,现在给定一个时间z问在 ...
- Codeforces Round #395 (Div. 2)(未完)
2.2.2017 9:35~11:35 A - Taymyr is calling you 直接模拟 #include <iostream> #include <cstdio> ...
- Codeforces Round #395 Div.1 C pacifist【JZOJ5449】Pacifist
题目 papyrus 喜欢谜题... 来解一道如何? 在你面前有一个被加密了的数组,其原数组是一个等差序列,你面前的则是将原数组中的所有数字都对m 取模再打乱后而得到的新数组 papyrus 给你出的 ...
- Educational Codeforces Round 90 (Rated for Div. 2)(A, B, C, D, E)
Educational Codeforces Round 90 (Rated for Div. 2) Donut Shops 思路 分三种情况: a==c/ba == c / ba==c/b这个时候两 ...
- Codeforces Round #506 (Div. 3)
Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...
- Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈)
Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈) 标签: codeforces 2017-06-02 11:41 29人阅读 ...
- Codeforces Round #563 (Div. 2)/CF1174
Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...
- Codeforces Round #270
Codeforces Round #270 题目链接 A:我是筛了下素数.事实上偶数仅仅要输出4和x - 4,奇数输出9和x - 9就可以 B:贪心的策略,把时间排序后.取每k个的位置 C:贪心.每次 ...
- 构造 Codeforces Round #302 (Div. 2) B Sea and Islands
题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...
最新文章
- 考察新人的两道c语言题目
- Ngrok实现远程控制和操作树莓派(Raspbian系统)
- 解决 .htaccess 导致的403禁止访问
- 【设计模式】单一职责原则
- 19-爬虫之scrapy框架大文件下载06
- c语言函数汉诺塔不用move,C语言——汉诺塔问题(函数递归)
- php flash chart,openflashchart 2.0 简单案例php版
- python字典获取关联值_【Python实战12】使用字典关联数据
- (2.2)HarmonyOS鸿蒙页面跳转
- Android之Intent深入
- 适合Java新手练手的小项目!
- python自学视频与excel_三大金融工具特训班_金融职场+智能量化高手必修课-Wind来袭+Python金融+Excel分析,全套视频教程学习资料通过百度云网盘下载...
- windows x86和x64的区别
- 计算机学霸电视剧,“学霸爱上学渣”的4部电视剧,部部甜到爆炸,全看过的真有眼光...
- 一个基于igv.js实现的python脚本,实现简单的网页版IGV
- WiFi知识点大总结
- 抖音SEO优化:最详细抖音视频SEO教程
- web前端期末大作业 魅力广西我的家乡介绍网页制作(HTML+CSS)
- SpringBoot开源项目案例
- H3c Smart-link 实验