1389

算个简单的树形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)的更多相关文章

  1. 2014百度之星资格赛 1004:Labyrinth(DP)

    Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  2. zoj 3706 Break Standard Weight(dp)

    Break Standard Weight Time Limit: 2 Seconds                                     Memory Limit: 65536 ...

  3. LightOJ 1033 Generating Palindromes(dp)

    LightOJ 1033  Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

  4. lightOJ 1047 Neighbor House (DP)

    lightOJ 1047   Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...

  5. 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 ...

  6. poj2479(dp)

    题目链接:http://poj.org/problem?id=2479 题意:求所给数列中元素值和最大的两段子数列之和. 分析:从左往右扫一遍,b[i]表示前i个数的最大子数列之和. 从右往左扫一遍, ...

  7. UVA11125 - Arrange Some Marbles(dp)

    UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...

  8. UVA - 1347 Tour(DP + 双调旅行商问题)

    题意:给出按照x坐标排序的n个点,让我们求出从最左端点到最右短点然后再回来,并且经过所有点且只经过一次的最短路径. 分析:这个题目刘汝佳的算法书上也有详解(就在基础dp那一段),具体思路如下:按照题目 ...

  9. 数字三角形/数塔问题(DP入门题)

    有形如下图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走,一起走到底层,要求找出一条路径,使路径上的值最大. 样例输入: 5 13 11 8 12 7 26 6 14 15 8 12 7 ...

随机推荐

  1. HDU 1272: 小希的迷宫(并查集)

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  2. 微信小程序实战之 pay(支付页面)

    项目目录: 逻辑层: pay.js // pages/pay/pay.js Page({ /** * 页面的初始数据 */ data: { resultType: "", resu ...

  3. B+树在NTFS文件系统中的应用

    B+树在NTFS文件系统中的应用 flyfish 2015-7-6 卷(volume) NTFS的结构首先从卷開始. 卷相应于磁盘上的一个逻辑分区,当你将一个磁盘或者磁盘的一部分格式化成NTFS,卷将 ...

  4. HDFS的体系架构

    通过对Hadoop分布式计算平台最核心的分布式文件系统HDFS.MapReduce处理过程,以及数据仓库工具Hive和分布式数据库Hbase的介绍.基本涵盖了Hadoop分布式平台的全部技术核心. H ...

  5. java基础入门-建立能够多client链接的ServerSocket

    承接上一篇文章,今天谈论一下能够多client链接的ServerSocket. 这里面注意涉及到的技术点是: 1.ServerSocket 2.多线程 这次我们分成两个类来实现,先上代码: packa ...

  6. Java中抽象类和接口的区别?

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  7. python和python3

    1 安装python和python3的方法 如果是python,那么直接python setup.py install; 如果是python3,那么直接python3 setup.py install ...

  8. ubuntu截图工具及GNOME的使用及类似qq截图快捷键

    1:了解gnome参数 gnome-screenshot -h

  9. 第一个Java程序示例——Hello World!【转】

    本文转载自: 跟随世界潮流,第一个Java程序输出“Hell World!”. 通过Eclipse运行程序 启动Eclipse,在菜单中选择“文件 --> 新建 --> Java项目”,弹 ...

  10. 中小企业可参考的数据库架构-mysql篇

    引言 数据库在众多互联网公司中应用日益广泛,不同的公司,使用姿势不尽相同,尤其是大公司,各种自研架构,羡煞旁人.但是,作为中小企业,由于分工和团队规模限制,很难实现自研,大多数情况下,使用开源架构. ...