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相关推荐

  1. Codeforces Round #395 (Div. 2) - A

    题目链接:http://codeforces.com/contest/764/problem/A 题意:有两个人,第一个人每n分钟到达一次目的地,第二个人每m分钟到达一次目的地,现在给定一个时间z问在 ...

  2. Codeforces Round #395 (Div. 2)(未完)

    2.2.2017 9:35~11:35 A - Taymyr is calling you 直接模拟 #include <iostream> #include <cstdio> ...

  3. Codeforces Round #395 Div.1 C pacifist【JZOJ5449】Pacifist

    题目 papyrus 喜欢谜题... 来解一道如何? 在你面前有一个被加密了的数组,其原数组是一个等差序列,你面前的则是将原数组中的所有数字都对m 取模再打乱后而得到的新数组 papyrus 给你出的 ...

  4. 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这个时候两 ...

  5. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  6. Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈)

    Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈) 标签: codeforces 2017-06-02 11:41 29人阅读 ...

  7. 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 ...

  8. Codeforces Round #270

    Codeforces Round #270 题目链接 A:我是筛了下素数.事实上偶数仅仅要输出4和x - 4,奇数输出9和x - 9就可以 B:贪心的策略,把时间排序后.取每k个的位置 C:贪心.每次 ...

  9. 构造 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 的例子可以 ...

最新文章

  1. 考察新人的两道c语言题目
  2. Ngrok实现远程控制和操作树莓派(Raspbian系统)
  3. 解决 .htaccess 导致的403禁止访问
  4. 【设计模式】单一职责原则
  5. 19-爬虫之scrapy框架大文件下载06
  6. c语言函数汉诺塔不用move,C语言——汉诺塔问题(函数递归)
  7. php flash chart,openflashchart 2.0 简单案例php版
  8. python字典获取关联值_【Python实战12】使用字典关联数据
  9. (2.2)HarmonyOS鸿蒙页面跳转
  10. Android之Intent深入
  11. 适合Java新手练手的小项目!
  12. python自学视频与excel_三大金融工具特训班_金融职场+智能量化高手必修课-Wind来袭+Python金融+Excel分析,全套视频教程学习资料通过百度云网盘下载...
  13. windows x86和x64的区别
  14. 计算机学霸电视剧,“学霸爱上学渣”的4部电视剧,部部甜到爆炸,全看过的真有眼光...
  15. 一个基于igv.js实现的python脚本,实现简单的网页版IGV
  16. WiFi知识点大总结
  17. 抖音SEO优化:最详细抖音视频SEO教程
  18. web前端期末大作业 魅力广西我的家乡介绍网页制作(HTML+CSS)
  19. SpringBoot开源项目案例
  20. H3c Smart-link 实验

热门文章

  1. 收藏 | 在yolov5上验证一些不成熟的想法
  2. 阿里格林深瞳计算机视觉岗实习面经
  3. 计算机双证学的是什么,​计算机在职研究生双证有些什么学校?怎么考?
  4. 当模型预测控制遇见机器学习
  5. android版 点击下载,自动点击器最新版
  6. 信安教程第二版-第26章大数据安全需求分析与安全保护工程
  7. VMware vSphere、 ESXi、Vcenter、vSphere Client关系
  8. 论文首页下划线怎么对齐_毕业论文标准格式要求是什么样的?
  9. Maven的基本应用
  10. 初使用 ReportViewer 控件时遇到的一点小麻烦