URAL1389. Roadworks(dp)
1389
算个简单的树形DP吧 不知道是不是数据太水 竟然一A了
就是对于当前节点有没有被选中就行选最优 有没有被选中的意思是有没有与它相连的边被选中
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<cmath> 8 using namespace std; 9 #define N 100010 10 vector<int>d[N]; 11 int dp[N][3],g; 12 struct node 13 { 14 int u,v; 15 }p[N]; 16 int dfs(int u,int v,int f) 17 { 18 if(dp[v][f]!=-1) 19 return dp[v][f]; 20 int i; 21 int s[2][2] = {0}; 22 int flag =0,x=-1; 23 for(i = 0 ; i < d[v].size() ; i++) 24 { 25 int tv = d[v][i]; 26 if(tv==u) continue; 27 flag = 1; 28 int s1 = dfs(v,tv,0); 29 if(f) 30 { 31 s[(i+1)%2][0] = s[i%2][0]+s1; 32 } 33 else 34 { 35 int s2 = dfs(v,tv,1)+1; 36 s[(i+1)%2][0] = s[i%2][0]+s1; 37 if(s[i%2][1]+s1<s[i%2][0]+s2) 38 { 39 s[(i+1)%2][1] = s[i%2][0]+s2; 40 x = tv; 41 } 42 else 43 s[(i+1)%2][1] = s[i%2][1]+s1; 44 } 45 } 46 if(!flag) 47 { 48 return dp[v][f] = 0; 49 } 50 if(x!=-1) 51 { 52 g++; 53 p[g].u = v; 54 p[g].v = x; 55 } 56 int maxz = 0; 57 for(i = 0 ; i < 2 ; i++) 58 maxz = max(maxz,max(s[0][i],s[1][i])); 59 return dp[v][f] = maxz; 60 } 61 int main() 62 { 63 int i,n,m; 64 while(cin>>n>>m) 65 { 66 memset(dp,-1,sizeof(dp)); 67 for(i = 0 ; i <= n ;i++) 68 d[i].clear(); 69 for(i = 1; i <= m ;i++) 70 { 71 int u,v; 72 cin>>u>>v; 73 d[u].push_back(v); 74 d[v].push_back(u); 75 } 76 dfs(-1,1,0); 77 cout<<dp[1][0]<<endl; 78 for(i = 1; i <= g ; i++) 79 cout<<p[i].u<<" "<<p[i].v<<endl; 80 } 81 return 0; 82 }
View Code
转载于:https://www.cnblogs.com/shangyu/p/3548393.html
URAL1389. Roadworks(dp)相关推荐
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- 求三角形最大面积(DP)
求三角形最大面积(DP) 在OJ上奇迹般WA了:WA:70. Why? #include <iostream> #include <string.h> using namesp ...
- leetcode 1269. 停在原地的方案数(dp)
示例 1: 输入:steps = 3, arrLen = 2 输出:4 解释:3 步后,总共有 4 种不同的方法可以停在索引 0 处. 向右,向左,不动 不动,向右,向左 向右,不动,向左 不动,不动 ...
- LeetCode 编辑距离 II(DP)
1. 题目 给你两个单词 s 和 t,请你计算出将 s 转换成 t 所使用的最少操作数. 你可以对一个单词进行如下两种操作: 删除一个字符 替换一个字符 注意: 不允许插入操作 题目保证有解 示例: ...
- LeetCode 1220. 统计元音字母序列的数目(DP)
文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串: - 字符串中的每个字符都应当是小写元音字母('a', 'e', 'i ...
- LeetCode 265. 粉刷房子 II(DP)
文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成 k 种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同. 当然,因为市场上不同颜色油 ...
- LeetCode 256. 粉刷房子(DP)
文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成红色.蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其与相邻的两个房子颜色不能相同. 当然,因 ...
- LeetCode 1223. 掷骰子模拟(DP)
1. 题目 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始 ...
- LeetCode 1155. 掷骰子的N种方法(DP)
1. 题目 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target,请你 ...
- LeetCode 712. 两个字符串的最小ASCII删除和(DP,类似编辑距离)
1. 题目 给定两个字符串s1, s2,找到使两个字符串相等所需删除字符的ASCII值的最小和. 示例 1: 输入: s1 = "sea", s2 = "eat" ...
最新文章
- bp神经网络应用实例_人工智能BP神经网络学习神器——AISPACE
- 计算机AL教程笔记,计算机系统基础学习笔记(2)-数据的位运算操作
- 柴油发电机组自动控制系统工作原理
- MySQL + Atlas 部署读写分离
- DevOps案例研究:庖丁解牛,剖析Google持续交付之道
- 当导用模块与包的import与from的问题(模块与包的调用)
- Project Euler 001-006 解法总结
- linux解挂文件磁盘的命令,Linux学习笔记(4)磁盘分区(fdisk)、挂载与文件系统命令...
- PRML5-神经网络(1)
- 如何画好软件项目架构图?
- 软件测试思想者 - 软件评测师考试顺利通关
- android nano app,实战nanoHTTPD嵌入android app(3)
- Python基础(8)字符串及常用操作
- 定义与声明、头文件与extern总结
- 捆绑软件?锁定主页?这4个地方可以下载到绝对纯净的Windows系统
- 加油吧 !!!冲冲冲
- 使用微软云服务器搭建Hadoop集群
- [Windows实用软件推荐:1]本地搜索工具Everything
- 8.8 Web前端-小米商城项目实战
- 宝马335i手动挡和M3手动挡的对比
热门文章
- vue 兼容IE解决方案, Babel .babelrc
- 【VUE/H5】H5调起数字键盘的坑,及手写移动端键盘代码
- java Runtime.exec方法详解
- 7z的压缩包linux下如何解压软件,7z(p7zip)压缩软件在Linux下的安装和使用
- three.js + jquery灯光照耀js特效
- graphpad prism怎么添加图例_Graphpad Prism 绘制散点图详细图解
- ECMAScript 6 入门教程
- php微博批量管理工具,简单快速批量取消微博的关注
- 联想rd650怎么装系统win7_ThinkServer - RD650 - RAID及系统安装 - 图文
- 第四批入围企业公示——年度TOP100智能网联供应商评选