URAL1389. Roadworks(dp)
算个简单的树形DP吧 不知道是不是数据太水 竟然一A了
就是对于当前节点有没有被选中就行选最优 有没有被选中的意思是有没有与它相连的边被选中
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
using namespace std;
#define N 100010
vector<int>d[N];
int dp[N][],g;
struct node
{
int u,v;
}p[N];
int dfs(int u,int v,int f)
{
if(dp[v][f]!=-)
return dp[v][f];
int i;
int s[][] = {};
int flag =,x=-;
for(i = ; i < d[v].size() ; i++)
{
int tv = d[v][i];
if(tv==u) continue;
flag = ;
int s1 = dfs(v,tv,);
if(f)
{
s[(i+)%][] = s[i%][]+s1;
}
else
{
int s2 = dfs(v,tv,)+;
s[(i+)%][] = s[i%][]+s1;
if(s[i%][]+s1<s[i%][]+s2)
{
s[(i+)%][] = s[i%][]+s2;
x = tv;
}
else
s[(i+)%][] = s[i%][]+s1;
}
}
if(!flag)
{
return dp[v][f] = ;
}
if(x!=-)
{
g++;
p[g].u = v;
p[g].v = x;
}
int maxz = ;
for(i = ; i < ; i++)
maxz = max(maxz,max(s[][i],s[][i]));
return dp[v][f] = maxz;
}
int main()
{
int i,n,m;
while(cin>>n>>m)
{
memset(dp,-,sizeof(dp));
for(i = ; i <= n ;i++)
d[i].clear();
for(i = ; i <= m ;i++)
{
int u,v;
cin>>u>>v;
d[u].push_back(v);
d[v].push_back(u);
}
dfs(-,,);
cout<<dp[][]<<endl;
for(i = ; i <= g ; i++)
cout<<p[i].u<<" "<<p[i].v<<endl;
}
return ;
}
URAL1389. Roadworks(dp)的更多相关文章
- 2014百度之星资格赛 1004:Labyrinth(DP)
Labyrinth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- zoj 3706 Break Standard Weight(dp)
Break Standard Weight Time Limit: 2 Seconds Memory Limit: 65536 ...
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
- Codeforces Round #260 (Div. 2)C. Boredom(dp)
C. Boredom time limit per test 1 second memory limit per test 256 megabytes input standard input out ...
- poj2479(dp)
题目链接:http://poj.org/problem?id=2479 题意:求所给数列中元素值和最大的两段子数列之和. 分析:从左往右扫一遍,b[i]表示前i个数的最大子数列之和. 从右往左扫一遍, ...
- UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...
- UVA - 1347 Tour(DP + 双调旅行商问题)
题意:给出按照x坐标排序的n个点,让我们求出从最左端点到最右短点然后再回来,并且经过所有点且只经过一次的最短路径. 分析:这个题目刘汝佳的算法书上也有详解(就在基础dp那一段),具体思路如下:按照题目 ...
- 数字三角形/数塔问题(DP入门题)
有形如下图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走,一起走到底层,要求找出一条路径,使路径上的值最大. 样例输入: 5 13 11 8 12 7 26 6 14 15 8 12 7 ...
随机推荐
- python05-09
一.lambda表达式 def f1(): return 123 f2 = lambda : 123 def f3 = (a1,a2): return a1+a2 f4 = lambda a1,a2 ...
- ZXing-core生成二维码和解析
如今二维码这么流行的时刻.也必须知道二维码是怎么生成.如今我们就来看看,是怎么生成的. 事实上主要是利用goggle公布的jar来使用:本文转自点击打开链接 1.二维码的生成 将Zxing-core. ...
- 使用vscode 编译 sass
由于我在工作中用的编辑器是 vscode ,所以记录一下vscode 编译sass 的配置 vs code 编译saass 1.在扩展里搜索“easy sass”,直接进行安装即可 2.安装后默认已经 ...
- Kemans算法及其Python 实现
算法优缺点: 优点:容易实现缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢使用数据类型:数值型数据 算法思想 k-means算法实际上就是通过计算不同样本间的距离来判断他们的相近关系的,相近的就 ...
- PyTorch 高级实战教程:基于 BI-LSTM CRF 实现命名实体识别和中文分词
前言:译者实测 PyTorch 代码非常简洁易懂,只需要将中文分词的数据集预处理成作者提到的格式,即可很快的就迁移了这个代码到中文分词中,相关的代码后续将会分享. 具体的数据格式,这种方式并不适合处理 ...
- 百度面试经历_web前端开发
百度面试经历_web前端开发 --2016年09月24日校招杭州站 刚面试完,担心过去就忘记掉,故回来时在地铁上用手机码下面试题目,供参考,也留作自己以后的面试参考依据.
- mac下Android Studio干净卸载
1.卸载Android Studio,在终端(terminal)执行以下命令: rm -Rf /Applications/Android\ Studio.app rm -Rf ~/Library/Pr ...
- 在 Vim 中优雅地查找和替换 vi【转】
本文转载自:http://harttle.land/2016/08/08/vim-search-in-file.html 总有人问我 Vim 中能不能查找,当然能!而且是超级强的查找! 这篇文章来详细 ...
- HDU3001 Travelling —— 状压DP(三进制)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3001 Travelling Time Limit: 6000/3000 MS (Java/ ...
- How to check HTML version of any website
http://howtocheckversion.com/check-html-version-website/ Check HTML version via W3C W3 Consortium ha ...