摘要: http://acm.hdu.edu.cn/showproblem.php?pid=3986题意: 起点为1,终点为N,伏地魔会将任意一条路径删除,要求算出删除任意一条边后的最短路径中最大的一个,伏地魔的角度来说就是,想删一条路harry走到终点的距离尽可能大。坑爹: 有重边,有反向边。删边的时候要记得连反边一起删除。解法: 用了个dijkstra + 堆优化的模板,因为伏地魔要删除harry的最短路径上的边才起到干扰的效果,所以枚举删除最短路径上的每一条边,每枚举一次计算出一次最短路,只要有计算不出的就输出-1,不然就输出最大的最短路。 1 #include 2 #include ... 阅读全文
posted @ 2013-08-24 16:20 pc.... 阅读(355) 评论(0) 推荐(0)
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1569题意: 给出M*N的格子,每个格子里都有数字,问你怎么样取数字能使其和最大,前提是取出来的格子不能两两相邻。坑爹: 如果按照方格取数的方法教上去会超时。解法:struct Edge //记录边{ int from; //边的起点 int to; //边的终点 int cap; //边的容量 int next; //优化DFS和BFS的搜索,因为边有很多个,每次从0开始找的话会超时,所以用个cur数组来初始化。}; 用dinic算法,里面有两个部分比较重要,一个是BFS,另一个是DF... 阅读全文
posted @ 2013-04-18 10:22 pc.... 阅读(593) 评论(0) 推荐(0)
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1565题意: 给出N*N的格子,每个格子里都有数字,问你怎么样取数字能使其和最大,前提是取出来的格子不能两两相邻。坑爹: 一开始以为不是选奇数位置就是偶数位置就能解出来的水题,仔细看了下题意发现天真了。。。解法: 这道题可以用网络流的最小割来做 最大流 = 最小割 = 最小点权覆盖集 = sum - 最大点权独立集先设置一个源点(0)和一个汇点( n*n+1),一开始初始化的时候把源点到所有 (i+j)%2 ==1的格子全部给个值,然后初始化把汇点到所有 (i+j) %2 == 0的格子也给个值,值就... 阅读全文
posted @ 2013-04-13 21:48 pc.... 阅读(1576) 评论(0) 推荐(0)
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1115题意: 给你多边形(N)的N个顶点 , 求这N个顶点构造出了N边形的重心。坑爹: 不能直接以三角形的推算出 x = (x1 + x2 + ... + xn)/n , y = (y1 + y2 + ... + yn) / n 。解法: 切分成N-2个三角形,然后分别算出每个三角形的重心和面积,面积通过叉积算出,N边形的重心坐标是x = ( Σ (Ai * pi.x))/ S .......Σ的i是从1到N-2 S是多边形面积 pi.x是第i块三角形的重心,同理可得yView Code 1 #inc... 阅读全文
posted @ 2012-12-15 17:56 pc.... 阅读(190) 评论(0) 推荐(0)
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1532题意: 从1开始到终点n,最多能通过多少的流量,就比如说1到2的流量是20,2到3的流量是10,那么到达终点3的流量为10,而1到2还能经过10的流量,2到3不能再通过。坑爹: 每次找到一条增广轨的时候要补一个反向的边,不然你走这一条路就认为你一定走了,因为有可能这条路不是最佳的路径。解法: 利用BFS搜索点,找到终点就返回1,没有则返回0,再设置一个maxflow函数,只要BFS的返回值为1,就将这条增广轨上的最大可以通过的流量(min)算出来(利用change_map函数),然后 max_fl... 阅读全文
posted @ 2012-11-24 17:38 pc.... 阅读(237) 评论(0) 推荐(0)
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1166View Code 1 /* 2 树状数组(二叉索引树,Binary Indexed Tree,BIT) 3 4 5 */ 6 7 #include <iostream> 8 #include <string> 9 using namespace std;10 11 const int maxn = 50010;12 int sum[maxn];13 int a[maxn];14 int n ;15 16 int lowbit (int x) //取x的最低位1,比如4,则... 阅读全文
posted @ 2012-11-10 12:15 pc.... 阅读(125) 评论(0) 推荐(0)
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1251题意: 给出你一些单词,然后在给出一些前缀,然后问你这些前缀是前面给的单词的前缀的有多少个。坑爹: 解法: 简单字典树。View Code 1 #include<iostream> 2 using namespace std; 3 4 struct Node 5 { 6 int a; 7 struct Node *son[26]; 8 int flag; 9 };10 struct Node *root;11 char str[26];12 13 void init(s... 阅读全文
posted @ 2012-11-03 16:50 pc.... 阅读(171) 评论(0) 推荐(0)
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1059题意: 给出价值分别为1-6的东西 , 输入代表价值为1-6的个数 , 现在问你将这些东西完全平分成两份 , 看能不能刚好平分.坑爹: 我一开始是想用多重背包算出 DP[sum] 然后在看下 DP[sum/2] 是不是刚好是sum的一半 , 但这样会超时解法: 用多重背包 把背包的 "体积" 定为总价值的一半就是行了 , 不需要算到 "体积" 为sum .View Code 1 #include<iostream> 2 using namespace 阅读全文
posted @ 2012-09-30 22:35 pc.... 阅读(202) 评论(0) 推荐(0)
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1171题意: 给定你每种设备的价值和数量 , 要你将这些设备平分( 就算不是刚好平分也要尽量接近).坑爹: 一开始看到这题是一点思路都没有 , 以为一定要刚好平分 . 数组要开到 50 * 50 * 100 .解法: 只要将所有设备的价值加起来(sum) , 然后利用多重背包 , 但"背包"的容量不是sum , 而是sum/2 , 这样就可以找出当"背包"的容量为总价值一半的时候的最优情况 , 然后另外一边分到的设备就是 sum - DP[sum/2] .View Co 阅读全文
posted @ 2012-09-15 19:22 pc.... 阅读(183) 评论(0) 推荐(0)
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1114题意: 有T组测试数据,后面的E和F分别表示存钱罐空的时候的重量和满了的时候的重量 , 然后有个m ,代表下面有 m 种钱币 , 每种钱币分别有他的面值和重量 , 要你求出当存钱罐满的时候 , 存钱罐中至少有多少钱.坑爹: 因为他是要求出最少有多少钱 , 所以要 DP[ j ] = min ( DP [j ] , DP[ j - cost ] + weight )还有一点要注意的是DP数组的初始化 , 要初始化为最大值 , 因为它每次都要求最小的一种情况 , DP[0] = 0是递推的一个开始.解法.. 阅读全文
posted @ 2012-09-15 17:45 pc.... 阅读(250) 评论(4) 推荐(0)