摘要: 题意:n个地点构成一棵树,第 i 个地点有 t_i 个人,现要选一个地点开会,求所有人行走距离之和的最小值。N<=10^5分析:先任选一个地点,求出总代价,然后就能求出相邻点的代价,一遍dfs就能求出所有点的代价。dfs会爆栈,需要开内存挂:#pragma comment(linker, "/STACK:1024000000,1024000000")View Code #include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#defin 阅读全文
posted @ 2012-09-17 17:33 BeatLJ 阅读(255) 评论(0) 推荐(0) 编辑
摘要: 题意:给一个无向图连通,图中每个结点都有一个权值,问能否割掉图中的一条边,使得图变为2个连通支,若能,使2个连通支中权值和的差最小,输出差的绝对值。N<=10^4分析:dfs时用tarjan判断边是否为割边,若是就更新答案。需注意的是有重边。View Code #include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define N 10000#define M 20000#define INF 0x3f3f3f3fint n,m,e,w[N];int 阅读全文
posted @ 2012-09-17 17:24 BeatLJ 阅读(221) 评论(0) 推荐(0) 编辑
摘要: 题意:对树中每个结点求其与能到达的最远结点的距离。N<=10^4分析:先求出树的直径(树中距离最远的2个点之间路径),对每个结点,求到达直径2个端点的距离,较大的即为结果。View Code #include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define N 10001int n,e;int first[N],next[N<<1],v[N<<1],w[N<<1];int dx[N],dy[N];void init 阅读全文
posted @ 2012-09-17 17:19 BeatLJ 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 题意:求树的最大点独立集中点的数目。View Code #include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define N 6001int n,e;int w[N],first[N],next[N],v[N],p[N];int dp[N][2];void init(){ e=0; memset(first,-1,sizeof(first)); memset(p,0,sizeof(p)); memset(dp,0,sizeof(dp));}void add 阅读全文
posted @ 2012-09-17 17:13 BeatLJ 阅读(186) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一棵树,边权表示通过此边的代价,给k个机器人,指定从点s出发,求遍历所有结点的最小代价和。分析:设计状态时不难想到用dp[i][j]表示从结点 i 出发遍历以它为根的子树的最小代价,但是转移时就遇到麻烦了,考虑只给你 1 个机器人的时候,这时要遍历所有结点就必然要走回头路,如果我们对每个结点再增加一个信息,表示从 i 出发遍历以 i 为根的子树且最后回到 i 的最小代价,这样转移就好办了,对于每个结点,将 j 个机器人分配给它的所有子结点,若分配 0 个机器人,则表明要派一个机器人去,遍历完了又回到 i 。方便起见,就以dp[i][0]表示从 i 出发遍历完子树 i 又回到i的最小代 阅读全文
posted @ 2012-09-17 17:07 BeatLJ 阅读(177) 评论(0) 推荐(0) 编辑