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. javascript 语法规范错误提示代码

    “Missing semicolon.” : “缺少分号.”, “Use the function form of \”use strict\”.” : “使用标准化定义function.”, “Un ...

  2. 再谈OpenCV

    虽然之前写过一篇关于OpenCV的介绍(http://blog.csdn.net/carson2005/article/details/5822149).但依旧有朋友对其不甚了解.所以,常常能碰到有人 ...

  3. 奥斯卡&#183;王尔德十大经典语录

    10不够真诚是危急的,太真诚则绝对是致命的.--摘自<身为艺术家的评论者> "A little sincerity is a dangerous thing, and a gre ...

  4. activiti自己定义流程之自己定义表单(一):环境配置

    先补充说一下自己定义流程整个的思路,自己定义流程的目的就是为了让一套代码解决多种业务流程.比方请假单.报销单.採购单.协作单等等.用户自己来设计流程图. 这里要涉及到这样几个基本问题,一是不同的业务需 ...

  5. WEB 字体

    之前如果想在自己的网站使用某些好看的字体,总是迫不得已得在PS里先把字体图片做好.虽然这样做也能达到我们想要的效果,但是这样就增加了HTTP请求 (如果在多处使用的话),即使合并所有图片,也不好管理, ...

  6. 设计模式-(10)观察者模式 (swift版)

    一,概念 观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式.GOF给观察者模式如下定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它 ...

  7. NDK编程中如何在C文件中打印调试信息

      1,在Android.mk文件中加上 LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog LOCAL_PATH := $(call my-dir)include ...

  8. RK3288以太网的mac地址调试笔记【学习笔记】【原创】

    平台信息:内核:linux3.1.0系统:android/android6.0平台:RK3288 作者:庄泽彬(欢迎转载,请注明作者) 邮箱:2760715357@qq.com 说明:提供以太网mac ...

  9. Linux 杀死所有进程

    方法一: sudo killall -9 netease-cloud-music 这种方法,必须要写全称. sudo netease-cloud-music QStandardPaths: XDG_R ...

  10. mysql查询表的字符集

    mysql查询表的字符集 SHOW CREATE TABLE user;