Valera and Elections

题意:现在有n个候选人, 有n-1条路, 如果选择了这个候选人, 这个候选人就会将从自己这个城市到1号城市上所有坏的路都修复一下,现在求最小的候选人数目, 如果答案有多种情况输出任何一种都可以。

输入:x y k 表示x与y之间有一条双向通道, k==1 表示这路是好的, k == 2表示这条路是坏的。

题解: 从1开始dfs搜索, 往外走, 如果遇到坏的城市就标记一下, 然后继续往外走, 如果更远的地方有一个坏的路就用更远地方的城市候选人代替这个标记的这个人。

代码:

 #include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
typedef pair<int, int> pll;
const int INF = 0x3f3f3f3f;
const int N = 1e5+;
vector<pll> E[N];
bool vis[N];
int cnt = ;
void dfs(int x, int n, int last)
{
for(int i = ; i < E[x].size(); i++)
{
pll tmp = E[x][i];
if(tmp.fi == last) continue;
if(tmp.se == )
{
cnt++;
if(vis[n]) cnt--, vis[n] = ;
vis[tmp.fi] = ;
dfs(tmp.fi, tmp.fi, x);
}
else dfs(tmp.fi, n, x);
}
}
int main()
{
int n;
scanf("%d",&n);
int x, y, ok;
for(int i = ; i < n; i++)
{
scanf("%d%d%d",&x,&y,&ok);
E[x].push_back(pll(y,ok));
E[y].push_back(pll(x,ok));
}
memset(vis, , sizeof(vis));
dfs(,,);
printf("%d\n", cnt);
for(int i = ; i <= n; i++)
if(vis[i]) printf("%d ",i);
return ;
}

最新文章

  1. 4. ValueStack 和 OGNL
  2. 判断表字段是否存在default约束
  3. 转:NodeJS、NPM安装配置步骤
  4. ByteBuffer解析
  5. Unity3D ShaderLab 使用渐变纹理着色
  6. ace-min.css
  7. Android 使用 popupWindow实现弹层并操作弹层元素
  8. Ubuntu下安装Redis并实现远程访问
  9. mac iterm2安装、sshpass密码记住
  10. C#中的Finalize,Dispose,SuppressFinalize(转载)
  11. JAVA String类型和原型模式
  12. 你可能不知道的printf
  13. [转帖] 百度知道: KMS 和OSPP
  14. php检测服务器是否可用 不可用发动钉钉消息
  15. python基础学习23----IO模型(简)
  16. CAS操作原理分析
  17. Linux下串口編程遇到的接收数据错误及原因(0x0d,0x11接收错误)
  18. java 实现输出姓和名
  19. LeetCode: Gray Code 解题报告
  20. unity3d绘画手册-------地形高度调节

热门文章

  1. 【iOS】Apple Mach-O Linker Error Linker command failed with exit code 1
  2. 用大白话告诉你 :Java 后端到底是在做什么?
  3. kubernetes离线包分析
  4. java8(一)Lambda表达式
  5. Scala类和对象(二)
  6. abc -- 牛客
  7. 转载 | Sublime Text3 安装以及初次配置
  8. 解决 Nginx 代理Apex慢的问题
  9. CentOS 安装 JDK 三种形式详细总结
  10. iView表格行验证问题