题意:一个家庭聚会,每个人都想送出礼物,送礼规则是, 一个人,先看名单列表,发现第一个祖先 就会送给他礼物,然后就不送了,如果他没找到礼物 他会伤心的离开聚会!告诉你m个祖先关系,

和每个人想给谁送!让你求出名单列表!

析:这个题,真是没想到啊,还是看的题解,首先要知道的是,如果自己和父结点送的人不一样,并且自己不是给自己的,那么就是无解,为什么呢?是这样的,假设自己和父结点送的人不一样,并且也不是给自己的,

那么一定是给自己的某个祖先,而父结点也是自己的某个祖先,那么不是同一个人,必定一个是另一个祖先,那么矛盾,所以一定是这样的,根据这个还不能确定出来结果,如果没人给自己送,那么这个结点就可以不要了,

在搜索时的有一个原则,用不到的就不要放上,更加简洁,也就是说,如果一个人不给自己送,那么这个人就没有存在的必要了,为什么呢?你想想,如果别人还给自己送了,自己又没给自己送,说明还有人是自己的祖先,

那么另一个人应该送和自己一样的人。对于搜索是先从祖先向下面进行搜索,然后判断能不能成立。

代码如下:

#include <bits/stdc++.h>

using namespace std;
const int maxn = 1e5 + 5;
vector<int> G[maxn],ans;
int a[maxn];
bool b[maxn];
bool ok; void dfs(int u, int fa){
for(int i = 0; i < G[u].size(); ++i){
int v = G[u][i];
if(v == fa) continue;//判断是不是和父结点一样
if(a[v] != a[u] && a[v] != v){ ok = true; return ; }//矛盾,直接结束
dfs(v, u);
}
if(a[u] == u) ans.push_back(u);//如果不给自己送,那么就没有存在的必要了
} int main(){
int n, m, u, v;
cin >> n >> m;
while(m--){
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
b[v] = true;//查找祖先
}
for(int i = 1; i <= n; ++i) cin >> a[i];
ok = false;
for(int i = 1; i <= n; ++i)
if(ok) break;
else if(!b[i]) dfs(i, -1);//搜索
if(ok) cout << "-1\n";
else{
cout << ans.size() << endl;
for(int i = 0; i < ans.size(); ++i)
cout << ans[i] << endl;
}
return 0;
}

最新文章

  1. FTP上传文件到服务器
  2. rsync数据同步备份
  3. Python SQLAlchemy --3
  4. 如何正确选择UI自动化测试
  5. SQL TO LINQ(Linqer神器)
  6. CSS文本与连接
  7. poj2002Squares(点集组成正方形数)
  8. 解决Github访问超慢问题[自己留档]
  9. HUD3336
  10. STARTUP.A51详解
  11. 一个想法(续五):IT联盟创业计划:现阶段进度公示、疑问解答及进行中的计划
  12. 【Android 应用开发】BluetoothServerSocket详解
  13. java--银行业务调度系统
  14. js循环获取table中的值
  15. Flask web开发之路十二
  16. P1297 [国家集训队]单选错位(期望)
  17. php 求余
  18. 【Java】 大话数据结构(1) 线性表之顺序存储结构
  19. python3 装饰器应用举例
  20. 2-Fourth Scrum Meeting20151204

热门文章

  1. Git回版本回退
  2. UVA-11292Dragon of Loowater
  3. Metasploit对安卓手机的攻击
  4. ubuntu apt-get dpkg-scanpackages 制作本地软件源
  5. rownum, row_number(), rank() , dense_rank(), partition by ,max() keep 语句的区别与用法
  6. RPC框架的服务注册和发现
  7. sql developer Oracle 数据库 用户对象下表及表结构的导入导出
  8. neovim在win10下安装配置
  9. leetcode382
  10. inl文件介绍