Codeforces Round #216 (Div. 2), problem: (C) Valera and Elections 【树形dp+dfs】
发布日期:2021-06-29 14:29:29
浏览次数:2
分类:技术文章
本文共 1170 字,大约阅读时间需要 3 分钟。
题意
给出n个点,n-1对关系,表示两点之间是否连通,1为连通,2为断。选中一个点,可以修复1到该点的路径上所有坏的边。求最少要选出哪些点。
思路
由于顶点数比较多,然后带权值,我们采用链式前向星建边,然后dfs。
在回溯的过程中,如果在当前点的儿子存在有问题的边,那就不选这个点
反之,如果没有并且连接这个点的边是有问题的边,这个点就是所求的点。
回溯时情况:
- 儿子存在有问题的边 不选择这个点 return 1
- 当前状态为2并且儿子下没有有问题的边,保存这个点 return 1
- 其他情况 return 0
code
#include#define endl '\n'using namespace std;const int maxn=2e5+5;int n,cnt,k;int head[maxn],vis[maxn];int ans[maxn],num[maxn];struct node{ int to,nex,w;}e[maxn<<1];void init(){ memset(head,-1,sizeof(head)); cnt=0,k=0; memset(vis,0,sizeof(vis));}void add(int u,int v,int w){ e[cnt].to=v; e[cnt].nex=head[u]; e[cnt].w=w; head[u]=cnt++;}int dfs(int u,int op){ vis[u]=1; for(int i=head[u];~i;i=e[i].nex){ int v=e[i].to,w=e[i].w; if(!vis[v]) num[u]+=dfs(v,w); } if(num[u]) return 1; if(op==2&&num[u]==0){ ans[k++]=u; return 1; } return 0;}int main(){ ios::sync_with_stdio(false); cin.tie(0); cin>>n; init(); for(int i=1;i<=n-1;i++){ int u,v,w; cin>>u>>v>>w; add(u,v,w); add(v,u,w); } dfs(1,-1); cout< <
学如逆水行舟,不进则退
转载地址:https://chocolate.blog.csdn.net/article/details/104142608 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2024年04月28日 02时21分02秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
2021.4.30课堂总结和作业
2019-04-29
需要吗?2000GB+学习视频教程 面试资料免费下载
2019-04-29
MySQL对已存在数据库表添加自增ID字段
2019-04-29
idea中的一些常用快捷键
2019-04-29
js校验表单后提交表单的三种方法总结【转载】
2019-04-29
欢迎使用CSDN-markdown编辑器
2019-04-29
a标签中href调用js的几种方法
2019-04-29
jstl标签详解
2019-04-29
Eclipse中使用SVN的使用
2019-04-29
JSON.parse和eval的区别
2019-04-29
JQuery中$.ajax()方法参数详解
2019-04-29
正则表达式的数字实例
2019-04-29
【转】EasyUI 验证
2019-04-29
Django项目实战---搜索引擎Elasticsearch
2019-04-29
Django实战----页面静态化
2019-04-29
Django实战---商城购物车的增删改、显示和合并购物车
2019-04-29
Django项目实战----订单页面的显示和生成订单、提交订单的逻辑
2019-04-29
Django项目实战----生成订单时高并发问题使用乐观锁
2019-04-29