摘要:
状态转移方程:dp[u][0] = max(dp[v][0],dp[v][1]);dp[u][1] += dp[v][0];#include #include #include #include #include using namespace std;const int maxn = 6010;vectortree[maxn];int rat[maxn],deg[maxn],dp[maxn][2];int max(int x,int y){ return x > y ? x : y;}void dfs(int u){ if(0 == tree[u].size()) { ... 阅读全文
摘要:
题目意思:给出n个点,m条边,边分为两种,一种是A公司的,一种是B公司的。边上有权值,问用n-1条边把n个点连起来的最小费用是多少,其中A公司的边刚好有k条。题目保证有解。题解:题目意思很简单就是求MST且A公司要有且仅有k条边在树中,刚开始做的时候用贪心的方式求最小生成树结果WA,后来看了下别人的题解,二分出一个最大值delta使得A公司的边加上这个值后再求MST时A公司的边有大于等于k条,然后答案就是cost of MST - k * delta。思想就是用一个delta去逼近答案。当delta越大的时候A公司的边就越少,反之越多。所以二分delta可以找到使得A公司刚好取K条边的要求。# 阅读全文
摘要:
题意: 莱克尔和她的朋友到公园玩,公园很大也很漂亮。公园包含n个景点通过n-1条边相连。克莱尔太累了,所以不能去参观所有点景点。经过深思熟虑,她决定只访问其中的k个景点。她拿出地图发现所有景点的入口都很特殊。所以她想选择一个入口,并找到一条最短的路来参观k个景点。我们假设景点之间的距离为1。解题思路:因为地图形状为树形,所以求树的最大直径。当k小于等于直径的时候输出k-1,当k大于直径的时候,因为访问了某一个景需要返回直径所在的路径上,所以当k大于冷的时候结果为len-(k-len-1)*2。#include #include #include #include #include using 阅读全文
摘要:
#pragma comment(linker,"/STACK:102400000,102400000")#include #include #include #include #include #include using namespace std;const int maxn = 200100;const int maxm = 2000100;struct node{ int v,next;}edge[maxm];struct Bridge{ int u,v;}bridge[maxm];int head[maxn],vis[maxm],fa[maxn],dfn[maxn 阅读全文
摘要:
题意: 平面上,一个圆,圆的边上按顺时针放着n个点。现在要连m条边,比如a,b,那么a到b可以从圆的内部连接,也可以从圆的外部连接。给你的信息中,每个点最多只会连接的一条边。问能不能连接这m条边,使这些边都不相交。解题报告:题意可能刚开始不是很好理解,比如1 5连边,2,6连边,由于点是顺序排列的,一画图就可以发现,这两条边必须一个从圆外面连,一个从内部连,否则就会相交。如果再加入3 7这条边,那么就必须相交了。这样,就可以转化成标准的2-sta问题:1:每个边看成2个点:分别表示在内部连接和在外部连接,只能选择一个。计作点i和点i'2:如果两条边i和j必须一个画在内部,一个画在外部( 阅读全文
摘要:
第一次按常规的方法求,将所有的查询的u,v,和最近公共祖先都保存起来,然后用tarjan+并查集求最近公共祖先。因为询问的次数过多,所以在保存查询的时候总是MLE,后来参考了一下别人的代码,才突然觉悟,可以先将u,v,和其最近公共祖先保存到数组,然后再求结果,为什么不能直接保存其结果了。如果只保存结果的话,保存查询操作就可以节约1/3的内存,所以基本可以过了。代码如下:方法一:#include #include #include #include #include using namespace std;const int maxn = 10100;vector >tree[maxn], 阅读全文
摘要:
记忆化搜索题目大意:老鼠出来后停在哪个格子就将那个格子里面的食物吃掉。每次出来都只能吃一方格的食物,每次出来最多跳过k个有食物的格子去吃另外那个格子里面的食物。思路:本题用记忆化搜索。其实就是记录在一个点上在之前搜索过程中的最大值,如果后来搜到了这没有大于这个值就停止搜索, 如果大于这更新这个最大值并继续搜索。题目源码如下:#include #include #include #include using namespace std;const int maxn = 110;int map[maxn][maxn],mark[maxn][maxn];int up[] = {0,0,1,-1};i 阅读全文
摘要:
Classified Problems on Online Judge 练习题选自以下在线测评系统* sicily:http://soj.me, 中山大学Sicily在线测评系统* UVA OnlineJudge, 题号前缀为uva* ProgrammingChanlanges Online Judge, 题号前缀为pc题目的分类仅供参考,很多题目有多种实现,有些题目比较综合,所以或许有不确切或不正确的分类,发现问题请提醒我。1. 编程入门2. 数据结构3. 字符串4. 排序5. 算术与代数6. 组合问题7. 数论8. 搜索: 回溯法,启发式搜索9. 图遍历10. 图算法11. 动态规划12. 阅读全文
摘要:
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1569题解:因为这个数据比较大,所以用动态规划会超时。将图转换成黑白棋盘问题,i + j 为奇数的与s节点相连,边的权值为棋盘上对应位置的值,其他的与t节点相连,边的权值为棋盘上对应位置的值,然后让棋盘上相邻之间的节点用边相连,边的权值为INF。这样问题就转换为了最大点权独立集问题。定理:1、最大点权独立集 = sum - 最小点权覆盖集。2、最小点权覆盖集 = 最小割 = 最大流dinic实现:#include #include #include #include #include using n 阅读全文
摘要:
题目大意:给出一个图,其中有一些点是出口,现在有一个罪犯有一个警察,各在两个不同的点。其中警察有一个最大速度160,问罪犯最少需要多大的速度,保证能从某个出口逃跑。一开始看了题目没什么感觉,当将题目看了两三遍后就发现只要到某一个点罪犯用的时间比警察的少则在那个点不会被抓,很显然,到某一个点会走最短路径。所以要用到两次最短路算法,二分罪犯车子的速度,然后搜索在当前速度下是否可以逃脱。注意的地方:1、对于无解可以spfa或者bfs判断一下,上面提出的有解的必要条件肯定没问题2、对于罪犯对整个图的最短路,需要注意的是不能经过警察的起点3、在二分速度之后,判断可以bfs,或者dfs,便是判断可以走到哪 阅读全文