摘要: 每天刷6题的目标看来还是有点难啊~先找一道以前A掉的题目充数吧~不过个人觉得这题用SPFA真的不错的~(因为网络流我还不会o(╯□╰)o)题意:有A,B两个人要越狱,A成功地从监狱到达火车站时B立即出发,两个人的路线不能有重合(可以重合点,不可以重合边),需要两个人路径和最短,求最短路径和。抽象一点,就是找到从点S到T的最短长度的环(即:两次路径不能有重边)思路:最大流的方法可以做,我用的是两次SPFA,相当于求两次最短路:先求一次最短路,然后把最短路上的S->T方向的边长赋值为INF,反向边长赋值为-map[u][v],即原来长度的相反数,然后再次SPFA,两次结果相加即可。对于标记为 阅读全文
posted @ 2013-02-14 16:27 ChrisZZ 阅读(299) 评论(0) 推荐(0) 编辑
摘要: 题意:题意很费解,大意是有N台电脑,每台电脑有N(N<=16)个服务,一个黑客可以在每台电脑上跑一个(只能跑一个)让一种服务崩溃的病毒,并且这个病毒可以传播到跟他邻接的顶点,问最多这个黑客可以让多少个服务崩溃?(每台电脑上都是N个不同服务,每台电脑上跑的都是一样的服务,让一个服务崩溃是让所有的电脑上的这个服务崩溃)分析:要想到题目对应的数学模型:把n个集合P1,p2,...,pn分成尽量多组使得每组中的所有集合的并集等于全集,这里集合Pi就是计算机i及其相邻计算机的集合,每组对应一种服务。书上说用二进制表示,我觉得有些地方还是不很理解。。。View Code 1 #include < 阅读全文
posted @ 2013-02-14 15:24 ChrisZZ 阅读(222) 评论(0) 推荐(0) 编辑
摘要: 题意:经典的取石子游戏是这样的:有一堆石子,A、B两个人轮流取,每次取一颗,只能从边上取,每个石子有相应的价值,A、B两人都想使得自己的价值最多,两个人足够聪明,问最后价值分别是多少本题则是可以取多颗,但仍然只能从一侧取得分析:状态转移方程best[i][j]=sum[i][j]-min(best[i][j-k],best[i+k][j], 0);{1<=k=j-i+1}.使用了记忆化的方法,O(n3),书上说有进一步的优化,不过当前数据下已经很快了(64ms)代码:View Code 1 #include <stdio.h> 2 #include <iostream& 阅读全文
posted @ 2013-02-14 13:49 ChrisZZ 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 题意:有两个长度分别为p+1和q+1的序列,每个序列中的各个元素互不相同,且都是1~n2之间的整数,两个序列的第一个元素都是1,问A和B的最长公共子序列的长度分析:由于在同一个序列中元素互不相同,可以转化LCS问题为LIS问题,使用了“置换的思想”,有点类似于“离散化”,然后用stl的lower_bound函数实现log级别的查找,使得整个复杂度为nlogn代码:View Code 1 #include <stdio.h> 2 #include <iostream> 3 #include <algorithm> 4 #include <string.h 阅读全文
posted @ 2013-02-14 12:44 ChrisZZ 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 题意:n个人报数,编号从1到n,第一次报m的人出列,以后每数k个数删除一次,问最后出列的人在最开始的时候编号是多少分析:约瑟环问题的变形,链表的方法不行,会tle。其实原题可以认为是第一次删除编号m,然后处理一个规模为n-1的子问题考虑这样一个问题:n个人(编号0~(n-1)),从0开始报数,报到m-1的退出,剩下的人继续从0开始报数。求胜利者的编号。我们知道第一个人(编号一定是(m-1)%n) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始): k k+1 k+2 ... n-2,n-1,0,1,2,... k-2 并且从k开始报0。 现在我们把他们的编号... 阅读全文
posted @ 2013-02-14 12:08 ChrisZZ 阅读(160) 评论(0) 推荐(0) 编辑