上一页 1 2 3 4 5 6 7 8 9 10 ··· 34 下一页
摘要: 题意:在一棵树上,找出一个节点,使得每一个节点到达该点的距离(权值*路径长度)和最短。分析:先dfs求出每一个节点到根节点的距离和,然后再一次深搜即可。交了之后悲剧的爆栈了,递归太是太深了,所以,开挂了,哈View Code #include<iostream>#include<algorithm>#include<vector>using namespace std;const int N = 100010;#pragma comment(linker, "/STACK:1024000000,1024000000") //开挂了,嘿嘿s 阅读全文
posted @ 2012-03-07 16:36 枕边梦 阅读(318) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一棵树,从1号顶点进入树中,每次可以分配人到其他可达的顶点去,杀死所有的bugs可以获取brain值,求出m个人最多能获取多少brain值。分析:树形DP,需要注意的有俩点:1)只有通过父节点才可能到达儿子节点,而且,通过父亲节点必须满足人数足够消灭该节点上的所有bugs2)对于每一棵子树而言,至少要有一个人才可能获得该子树上的brain,即使没有bugs用dp[i][j]表示派遣j个人到达以i为根的子树所能获得的最大brain值View Code #include<iostream>#include<algorithm>#include<string& 阅读全文
posted @ 2012-03-07 14:11 枕边梦 阅读(633) 评论(1) 推荐(1) 编辑
摘要: 题意:给定一棵树,每条边都有各自的权值,要求用K个机器人(从根出发),遍历整棵数,求最小总权值分析:一开始很清楚的知道,还是一道树形背包,用dp[i][j]表示以节点i为根的子树选了j个机器人遍历的权值和。关键在j==0 时的意义的理解,一开始总处理不好,就是dp[i][0]表示的是以i为根的子树放置一个机器人遍历完子树之后又回到iView Code #include<iostream>#include<algorithm>#include<string>#include<vector>using namespace std;const int 阅读全文
posted @ 2012-03-07 08:21 枕边梦 阅读(244) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一棵树,求每一个节点所能到达的最长路径的长度分析:以编号的i的节点为例(非根节点),最长的路径长度只有俩种可能,1)子树中存在最长路径;2)通过父节点的路径中存在最长路径所以,只有分别求出每一节点对应的那俩种路径取大最大值即可,当然,根节点只存在第一种可能View Code #include<iostream>#include<algorithm>#include<string>#include<vector>using namespace std;const int N = 10010;int n,dist[N],dp[N];stru 阅读全文
posted @ 2012-03-06 16:21 枕边梦 阅读(292) 评论(0) 推荐(0) 编辑
摘要: 纯模拟的题目,一开始用map偷懒,却一直WA了,用普通的方法其实也WA了很久名字之间可能有多个空格隔开吧,一开始一直从左边往右搜,覆盖空格的位置,但是到第二个空格的话,我就退出循环了,一直WA,换成从右往左搜,找到第一个就可以退出了,就这样,过了…………“A single blank space” 空白区呀,我错了,这就是英语水平的问题呀………………,一直以为是一个空格的意思View Code #include<iostream>#include<algorithm>using namespace std;struct name{ char str[100]; int 阅读全文
posted @ 2012-03-04 17:51 枕边梦 阅读(275) 评论(0) 推荐(0) 编辑
摘要: View Code #include<iostream>using namespace std;#define MAX 100#define BASE 10000void multiply(int a[], int Max, int b) //大数乘法,注意参数的传递{ int i, array = 0; for (i = Max - 1; i >= 0; i--) { array += b * a[i]; a[i] = array % BASE; // 数组每一位存放大数的四位数字 array /= BASE; }}void ... 阅读全文
posted @ 2012-03-04 15:34 枕边梦 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一棵树,每一节点都有一权值,要求选出总权值最大的K个点,同时这K个点中任意一个点都不能是其他节点的祖先。。分析:呵呵,一看到题目就感觉是一个树形背包了,可是节点数太多了,150000,吃不消呀,如果用二维数组保存的话,很好写呀,可是肯定爆内存的,所以开了一个临时数组保存模型跟一般的树形背包还是很像的View Code #include<algorithm>#include<vector>#include<iostream>using namespace std;const int N = 150010;vector<int> g[N]; 阅读全文
posted @ 2012-03-04 15:01 枕边梦 阅读(509) 评论(0) 推荐(0) 编辑
摘要: EK 算法:邻接矩阵保存模板题hdu3549#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<climits> using namespace std; #define N 16 int capacity[N][N];//容量 int flow[N];//残余流量 int pre[N];//前趋 int n, m; queue< 阅读全文
posted @ 2012-03-02 15:19 枕边梦 阅读(258) 评论(0) 推荐(0) 编辑
摘要: 纠结了N久 的题目,终于过了,LCA转RMQ的思想首先,求出欧拉序列F[]以及深度序列B[],同时,用pos[]记录每一个节点第一次出现的位置(在欧拉序列中的位置);之后,就是LCA转化为RMQ的问题了,LCA(u,v)=F(RMQ(B,pos[u],pos[v]))ps:pos[u]<pos[v]:深度序列中,2个点之间的最小深度就是最近公共祖先View Code #include<iostream>#include<algorithm>#include<vector>#include<math.h>#define MAXN 10010u 阅读全文
posted @ 2012-02-29 13:00 枕边梦 阅读(328) 评论(0) 推荐(0) 编辑
摘要: 树状数组的一维和二维模板模板int lowbit(int x){ return x & (-x);}void modify(int x,int add)//一维{ while(x<=MAXN) { a[x]+=add; x+=lowbit(x); }}int get_sum(int x){ int ret=0; while(x!=0) { ret+=a[x]; x-=lowbit(x); } return ret;}... 阅读全文
posted @ 2012-02-27 22:18 枕边梦 阅读(4205) 评论(0) 推荐(2) 编辑
上一页 1 2 3 4 5 6 7 8 9 10 ··· 34 下一页