上一页 1 ··· 11 12 13 14 15 16 17 18 19 ··· 23 下一页
摘要: 题目链接经典的8数码问题,不要求是最少步数。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <queue> 4 #define N 362881 5 #define ABS(x) ((x)>0?(x):(-(x))) 6 using namespace std; 7 const int dx[4]={0,0,1,-1}; 8 const int dy[4]={1,-1,0,0}; 9 char DIR[4]={'r','l','d&# 阅读全文
posted @ 2012-05-11 15:33 BeatLJ 阅读(679) 评论(0) 推荐(0)
摘要: 题目链接题目大意:给定一棵树,每个结点有一个值,求一棵含k个结点的子树,使子树的值最大。(树的值为所含结点的值的和)分析:n最大为100,定义状态dp[u][k]为以结点u为根结点且含k个结点的子树的最大值。用左二子右兄弟来存树,不难写出状态转移方程。纠结之处在于使用memset(dp,-1,sizeof(dp))就WA,改成memset(dp,0xff,sizeof(dp))就AC了。其中还有好几次CE莫名其妙,提示信息为"Getting complication error information failed!"AC的代码 1 #include <stdio.h 阅读全文
posted @ 2012-05-03 21:48 BeatLJ 阅读(1102) 评论(0) 推荐(0)
摘要: 题目链接题目大意:给定一个流量网络,网络的拓扑结构是无根树,定义A(k)以结点k为源点,其他叶子结点为汇点的最大流量,求的是A(k)的最大值(k=1,2,3……n)。分析:这题跟树形DP专题Computer那题有点像,那题是距离,这题是流量,本质还是一样。从结点k流出的流量,要么经过儿子结点流出,要么经过父亲结点流出。先DP求每个结点经过儿子结点能流出的最大流量是s[k],在DP求每个结点经过父亲结点能流出的最大流量f[k]。最后结果是MAX(s[k]+f[k]),k=1,2,3...n。s[k]=sum(MIN(s[i],wik)),i是k的儿子结点且不是叶子结点。s[k]=sum(wik) 阅读全文
posted @ 2012-05-03 19:06 BeatLJ 阅读(319) 评论(0) 推荐(0)
摘要: 题目链接这题跟Balance Act那题差不多,求图的质点。我直接将那题改了一下提交,结果PE了一次,又WA了一次,最后发现是单case,多case的提交为什么WA呢?View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <vector> 4 #define N 16000 5 #define MAX(a,b) ((a)>(b)?(a):(b)) 6 using namespace std; 7 vector<int> g[N]; 8 int n,p[N],d[N], 阅读全文
posted @ 2012-05-02 21:59 BeatLJ 阅读(263) 评论(0) 推荐(0)
摘要: 题目大意:给定一棵树,求移除树中哪些结点后,剩下的结点最多的连通支的结点数目不超过原树总结点的一半。分析:先用dfs将无根树转为有根树,在一棵有根树中,去掉某个结点后,剩余的分支为儿子结点所在的分支和父亲结点所在的分支,取结点数目最多的一支即可。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <vector> 4 #define N 10000 5 #define MAX(a,b) ((a)>(b)?(a):(b)) 6 using namespace std; 7 vec 阅读全文
posted @ 2012-05-02 21:24 BeatLJ 阅读(239) 评论(0) 推荐(0)
摘要: 题目链接题目大意:给定一棵树,对树中每一个结点,求其距其他结点的最远距离。分析:最初的想法是对每个结点求一次DFS,那样的话复杂度是O(N2),由于n最大可达10000,所以这个方法肯定会超时。根据树的特殊性可知,每个结点到距其最远的结点,要么通过其儿子结点到达,要么通过其父结点到达,由此想到可用树形动态规划。具体实现时,定义状态df[k],d1[k],d2[k],分别表示结点k通过父结点能到达的最远距离,通过儿子结点能到达的最远距离,通过儿子结点能到达的第二远距离。View Code 1 #include <stdio.h> 2 #include <string.h> 阅读全文
posted @ 2012-05-02 20:35 BeatLJ 阅读(275) 评论(0) 推荐(0)
摘要: 题目链接题目大意:给定一个连通无向图,每个结点有一个值,现要断开图中某条边,使得原图变成两个连通子图,且要使两个子图的值的差最小。输出最小差,若无法完成,则输出"impossible”分析:要使断开某条边后,原图变成两个连通支,则断开的边一定是桥。对图进行DFS时,得到一颗树,图中有的而树中没有的边叫回边,回边一定不是桥。由此想到可用dfs将图转化为树来做,但树中的边不一定是原图中的桥,问题关键在于桥的判断。此题还需要注意的是可能有重边。View Code 1 #include <stdio.h> 2 #include <math.h> 3 #include 阅读全文
posted @ 2012-05-02 14:59 BeatLJ 阅读(214) 评论(0) 推荐(0)
摘要: 题目链接题目大意:给定一个有向图(n<100),求最小圈。分析:任何一个圈至少有两个点,在圈中任取两个点i,j,圈的长度可以看成是d[i][j]+d[j][i],所以先用floyd求任意点对的最短距离,然后枚举点对求最小圈长。时间复杂度为O(N3)。View Code 1 #include <stdio.h> 2 #define MIN(a,b) ((a)<(b)?(a):(b)) 3 #define N 100 4 #define INF 0x7fffffff 5 int n,m; 6 int d[N][N]; 7 int main() 8 { 9 int i,j,k 阅读全文
posted @ 2012-05-01 22:22 BeatLJ 阅读(183) 评论(0) 推荐(0)
摘要: 题目链接题目大意:给定一个无向图,指定2个起点s1和s2和一个终点t,2个人分别从s1和s2出发,目的地是t,求两人的最短路径的最大公共长度(在保证两人均走最短路的前提下使两人一起走的路径最长)。分析:只要两人会合后,就一定会一起走完剩下的全程。所以大体思路是枚举可能的会合点,在判断某个点是否是可能的会合点时,判断这个点是否都是两个人的最短路径上的点即可。求最短路时用到dijkstra。View Code 1 #include <stdio.h> 2 #include <memory.h> 3 #define N 1000 4 #define INF 0x7fffff 阅读全文
posted @ 2012-05-01 21:23 BeatLJ 阅读(258) 评论(0) 推荐(0)
摘要: 题目链接题目大意:给定一棵树,每个结点有一个权值,一棵树的权值为所有结点的权值和,现将这棵树分为两棵子树,要使得两子树的权值差最小。我的做法是先将无根树化为有根树,然后求每棵子树的权值,最后用一次扫描求结果。需要注意的是结果要用long long型。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <vector> 4 #define N 100000 5 #define MAX(a,b) ((a)>(b)?(a):(b)) 6 #define MIN(a,b) ((a)&l 阅读全文
posted @ 2012-04-27 22:18 BeatLJ 阅读(248) 评论(0) 推荐(0)
上一页 1 ··· 11 12 13 14 15 16 17 18 19 ··· 23 下一页