08 2013 档案
摘要:题意:n个点n-1条边;定义集合{A,B,C}若三点能被一条路径覆盖则叫做能被简单路覆盖;求不被简单路覆盖的集合数;正式做的时候我们队一直在说,树形DP,树形DP。树形DP!可是三个人都不会= =。。。思路:由于直接计算情况较多,可转化为算补集,即能被简单路覆盖的集合数。 显然,假设ABC依次为路径上的点,那么A C一定在以B为根的不同子树中。 那么我们就可以通过枚举B 为根,方案数就是s为B子树的大小; 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #includ...
阅读全文
摘要:Kuhn-Munkras算法流程: (1)初始化可行顶标的值 (2)用匈牙利算法寻找完备匹配 (3)若未找到完备匹配则修改可行顶标的值 (4)重复(2)(3)直到找到相等子图的完备匹配为止直接附代码 1 bool dfs(int x)//匈牙利算法寻找x的增广路径 以x为根的M的交错树 2 { 3 int y,t; 4 visx[x]=true; 5 for(y=0;yt)22 slack[y]=t;23 }24 }25 return false;26 }27 //外层的匈牙利算法需要O(2)的...
阅读全文
摘要:这题与裸的二分图最小路径覆盖的区别是结点可重复走,从而变为了传递闭包的最小路径覆盖。具体做法是用floyd将凡是能连通的结点都标记为能直接走到,然后建一条边,最后用最小路径覆盖做就行了~ 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 //#include 13 #include 14 #include 15 #include 16 #define INF 0x7fffffff...
阅读全文
摘要:这题一开始以为可以直接套最大独立集模板,结果发现样例都过不了。看了discuss后有人说是n-m/2,因为要去掉搞基的= =瞬间吓尿了,到现在还不知道他怎么看出来的。反正我的想法是因为题目输入使配对重复,即A和B搞暧昧与B和A搞暧昧是一样的,故求出最大匹配后要除二。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 //#include 13 #include 14 #inclu...
阅读全文
摘要:题目大意:N块田地M条道路。1为起点,N为终点,FJ从起点走到终点,经过不重复的路(可经过重复的点)再回到起点,求所花费最小时间。建图要点: 1.要求路不重复,则使路的容量都为1. 2.从起点到终点,再从终点到起点,故建立超级源点0超级汇点N+1,建路0-1,N-N+1容量都为2。 3.有重边,所以要用邻接表。 4.无向图,所以每条边都要建立正反两边。又因为一条路可能是从起点到终点时经过,也可能是从终点到起点时经过,所以还要建立反向的正反两边,一共4边。 5.因为此题是无向图,所以建边的时候如果建两条费用都是正的边的话,退流时无法修正费用。 ...
阅读全文
摘要:问题描述:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。例如:X(A,B,C,B,D,A,B) Y(B,D,C,A,B,A)那么最长公共子序列就是:B,C,B,A算法设计:用动态规划方法解决最长公共子序列的结构:设X = { x1 , ... , xm },Y = { y1 , ... , yn }及它们的最长子序列Z = { z1 , ... , zk }则:1、若 xm = yn .
阅读全文
摘要:一、Dinic算法的步骤以及复杂度分析算法步骤: Dinic算法的思想也是分阶段地在层次图中增广。它与最短路径增值算法不同之处是:在Dinic算法中,我们用一个dfs过程代替多次bfs来寻找阻塞流。下面给出其算法步骤: 1、初始化流量,计算出剩余图2、根据剩余图计算层次图。若汇点不在层次图内,则算法结束3、在层次图内用一次dfs过程增广4、转步骤2View Code 下面是dfs的过程:p=s;While outdegree(s)>0 u=p.top; if ut if outdegree(u)>0 设(u,v)为层次图中的一条边; ...
阅读全文
摘要:1.floyd算法 (n^3复杂度)基本思想:开始设集合S的初始状态为空,然后依次将0,1,。。n-1定点加入,同时用d[i][j]保存从i到j,仅经过S中的定点的最短路径,在初始时刻,d[i][j] = A[i][j]中间不经过任何节点,然后依次向S中插入节点,并进行如下更新d(k)[i][j] = min{ d(k-1)[i][j],d(k-1)[i][k]+d(k-1)[k][j]}还可以使用一个二维数组path指示最短路径。path[i][j]给出从定点i到j的最短路径上,定点i的前一个顶点代码相当简单,最容易的实现方法:for (k = 0;k =表示求最小值,作为最长路,=构图时类
阅读全文

浙公网安备 33010602011771号