10 2013 档案

摘要:题意:问有多少个N(N 2 #include 3 typedef long long LL; 4 LL dp[70][70][101]; 5 LL pow_mod(LL a,LL p,LL n){ 6 if(p == 0) return 1; 7 LL ans = pow_mod(a,p/2,n); 8 ans = ans * ans % n; 9 if(p%2 == 1) ans = ans * a % n;10 return ans;11 }12 13 int main(){14 int nkase;15 scanf("%d... 阅读全文
posted @ 2013-10-31 21:31 浙西贫农 阅读(689) 评论(0) 推荐(0)
摘要:题意:给出一张有n个点的图,有的边又向,有的边无向,现在要你破坏一些路,使得从点0无法到达点n-1。破坏每条路都有一个代价。求在代价最小的前提下,最少需要破坏多少条道路。(就是说求在最小割的前提下,最小的割边数)这题做了长姿势了。偏移量的方法没有想到。如果采用偏移量的方法的话,把每条边的边权w设为w'=w*MOD+1,然后求最小割,那么maxflow%MOD就是答案了。前提是MOD足够大。另外一种方法,利用一个结论:最小割边一定满流,满流的未必是最小割边。假设所有满流的边都是最小割边,把它们的cap全部设为1,其余未满流的边的cap设为inf,然后求最小割,答案就是最小割值。虽然没搞懂 阅读全文
posted @ 2013-10-31 21:22 浙西贫农 阅读(209) 评论(0) 推荐(0)
摘要:题意:给出一颗树和树根,每条树边都有边权,要你砍断一些边,使得所有的叶子节点都与根节点分离,且要求砍断的边权之和最小。以树根root为源点S,添加一个汇点T,对所有的非跟叶子节点i,加边(i,T,inf),求最小割即可。 1 #include 2 #include 3 #include 4 #include 5 #define INF 1<<30 6 #define maxn 1010 7 #define maxm 10000 8 using namespace std; 9 10 int u[maxm],v[maxm],next[maxm],w[maxm];11 int firs 阅读全文
posted @ 2013-10-31 09:56 浙西贫农 阅读(156) 评论(0) 推荐(0)
摘要:题意:一个国家的地图是一张n个点m条边的有向图。你保卫了国家成为了英雄,现在国王答应给你一些城市。国王居住在首都,编号为1,但他不想随意的到达你的领地,所以你必须破坏一些路,使得从首都到你所拥有的所有城市不连通。而破坏这些路需要花钱。国王给了你f个城市供你选择,每个城市有一个价值。你最后的总收益=你选择的城市的价值之和-破坏路花费的钱。现在让你输出最大的收益,以及完成这样的收益应该破坏哪些路。首先对于表示这个国家地图的有向边(u,v,cost),直接在图中建一条一样的边(u,v,cost)。对于供你选择的城市i,假设它的价值是value,创建一个汇点T,建一条(i,T,value)的边。然后以 阅读全文
posted @ 2013-10-30 22:32 浙西贫农 阅读(342) 评论(0) 推荐(0)
摘要:题意:给出一张有向图。如果一个节点在图中被删除后,就能使得从S->T不连通,则称这个点key vertex。问这张图中有多少个点是key vertex。网上有两种说法,一种是网络流,就是拆点建图,求最小割,为了限制增广次数,把S、T拆点后的容量限制到2,这样一来跑最大流得到maxflow,如果maxflow=0,则说明全部的点都可以是key vertex,如果maxflow=2,则说明只有S、T是key vertex,如果maxflow=1的话,就需要到残量网络中去找了。怎么找呢?首先从S出发始寻找在残量网络中可以到达的所有的点,把它们保存在一个队列里,并记上vis标记,然后把这个队列里 阅读全文
posted @ 2013-10-30 19:59 浙西贫农 阅读(419) 评论(0) 推荐(0)
摘要:题意:给出一张无向图,每个点上都有一个权值,然后让你删掉权值之和尽量小的点,使得S到H不连通。无向图带权点连通度问题。每个点拆点,容留为点权,对于原来图中的无向边(u,v),拆成两条边(u',v,inf),(v',u,inf),跑S'到T 的maxflow就可以了。 1 #include 2 #include 3 #include 4 #include 5 #define INF 1<<30 6 #define maxn 210 7 #define maxm 30000 8 using namespace std; 9 10 int v[maxm],next 阅读全文
posted @ 2013-10-30 17:12 浙西贫农 阅读(158) 评论(0) 推荐(0)
摘要:题意:有一个n*m的矩阵,里面可以放金蛋也可以放银蛋。分别给出在2个矩阵map1,map2表示在矩阵的每个格子里放金蛋的得分和放银蛋的得分。如果相邻的两个格子里都放了金蛋,则总得分要减去G,如果相邻的两个格子里都放了银蛋,则总得分要减去S。现要求你求出放蛋的最大得分。跟HDU 3657比较像,但是这里更加复杂了,因为两种得分,一种金蛋,一种银蛋。所以我的理解是这里是两个二分图合起来的一个二分图,因为金蛋和银蛋存在一个匹配的关系,给矩阵染色后,黑格和白格也存在一个匹配的关系。因此,这样建图:假设行数i+列数j这和为偶数的格子为黑格,奇数的为白格,每个格子拆成两个点k,k',分别表示放金蛋 阅读全文
posted @ 2013-10-30 16:26 浙西贫农 阅读(240) 评论(0) 推荐(0)
摘要:题意:有个人有一种记单词方法,如果一个单词的最后一个字母和另外一个单词的首字母相同,他就同时可以记住,现在他想按照这样的规则把n个单词串起来(就是一个单词的最后一个字母和另外一个单词的首字母相同),有些单词的回文串也是有意义的,因此他既可以正着记,也可以倒着记,现在问他能不能调整那些回文串有意义的单词的正序逆序把这n个单词串起来。混合图的欧拉路径,不是欧拉回路。如果是混合图的欧拉回路问题,在《网络流建模汇总》这篇论文里已经有了具体的方案了。这里需要做的处理就是,如果存在合法路径,而这个路径不构成回路的话,那么我们可以人为的找出起点和终点(就是度数为奇数的点,且只有两个,根据入度出度谁大谁小可以 阅读全文
posted @ 2013-10-29 21:57 浙西贫农 阅读(205) 评论(0) 推荐(0)
摘要:题意:给出一个N*M的矩阵,0表示空地,1表示有一只羊,2表示有一只狼,你可以再图上方格的边缘添加单位长度为1的栅栏使得任意的动物都不能通过。问最少添加多少个单位长度为1的栅栏使得狼抓不到羊。是我想的太多了,可能是因为我想少去建条边。其实这里件图建的还是很暴力的。对所有相邻的格子,都建一条cap=1的边,另外,所有有羊的格子,从源点S到羊所在的格子建一条cap=inf的边,对所有有狼的格子,都从有狼的格子到汇点T建一条cap=1的边。求出的最小割容量就是答案。 1 #include 2 #include 3 #include 4 #include 5 #define INF 1 1) ... 阅读全文
posted @ 2013-10-29 14:46 浙西贫农 阅读(223) 评论(0) 推荐(0)
摘要:题意:有n个人n个位置。给出一个n*n的矩阵,第i行第j列表示第i个人可以做第j个位置。现在要求每个人都找到一个不同的位置,当他们全部找到各自的位置时,一轮结束,他们可以开始新的一轮。在新的一轮里,每个人同样会去找位置,但是每个人都不会去找原先已经坐过的位置。问一共可以进行多少轮这样的匹配,并输出每一轮的匹配方案。如果不要求输出匹配方案,那好办,跟那个婚姻匹配的一样的办法。现在问题的关键是要求输出每一轮匹配的方案。于是。。就跑了n遍dinic。首先,二分一个mid(轮次),从S到每个人i连一条边(S,i,mid),再从每个位置j到T连一条边(j,T,mid),如果i可以选择j的话,连一条边(i 阅读全文
posted @ 2013-10-28 21:10 浙西贫农 阅读(236) 评论(0) 推荐(0)
摘要:题意:给出一张n个点m条边的无向图( 2 2 #include 3 #include 4 #include 5 #include 6 #define INF 1 pii; 11 int v[maxm],next[maxm],w[maxm]; 12 int first[maxn],d[maxn],work[maxn],q[maxn]; 13 int e,S,T,N,M; 14 struct Edge{ 15 int from,to,dist; 16 }edge[100010]; 17 18 void init(){ 19 e = 0; 20 memse... 阅读全文
posted @ 2013-10-27 20:10 浙西贫农 阅读(208) 评论(0) 推荐(0)
摘要:有N个男孩,N个女孩。每个女孩可以选择一个没有跟他吵过架的男孩结婚。如果女孩X和女孩Y是朋友,且Y没有和男孩Z吵过架,女孩X同样可以选择男孩Z和自己结婚。另外,如果A和B是朋友,B和C是朋友,那么A和C也必定是朋友。每一轮中,每个女孩还可以额外选择K个自己原本不打算和她配对的男孩配对。一旦所有的女孩都找到了男友,那么他们就可以开始一轮新的游戏了,在每一轮新的游戏中,他们将使用相同的规则进行游戏,但是所有的女孩都不会选择之前选择过的男友了。问他们最多可以进行几轮游戏。跟HDU 3081基本一样,就是多了一个条件:每一轮中,每个女孩还可以额外选择K个自己原本不打算和她配对的男孩配对。这里的处理是把 阅读全文
posted @ 2013-10-27 17:39 浙西贫农 阅读(278) 评论(0) 推荐(0)
摘要:题意:有N个男孩,N个女孩。每个女孩可以选择一个没有跟他吵过架的男孩结婚。如果女孩X和女孩Y是朋友,且Y没有和男孩Z吵过架,女孩X同样可以选择男孩Z和自己结婚。另外,如果A和B是朋友,B和C是朋友,那么A和C也必定是朋友。一旦所有的女孩都找到了男友,那么他们就可以开始一轮新的游戏了,在每一轮新的游戏中,他们将使用相同的规则进行游戏,但是所有的女孩都不会选择之前选择过的男友了。问他们最多可以进行几轮游戏。可以二分游戏的轮次数。首先做floyd闭包传递,确定女孩i可以与哪些男孩j配对。假设一共可以进行k轮游戏,那么从起点S向每个女孩i连一条边(S,i,k),从每个男孩向汇点T连一条边(i,T,k) 阅读全文
posted @ 2013-10-27 13:29 浙西贫农 阅读(240) 评论(0) 推荐(0)
摘要:有两个资源供应,而需求只有一个,把需求拆点,限制容量,放中间,其中一个点跟资源1相连,另外一个点与资源2相连,跑最大流。 1 #include 2 #include 3 #include 4 #include 5 #define INF 1<<30 6 #define maxn 10100 7 #define maxm 1000000 8 using namespace std; 9 10 int v[maxm],next[maxm],w[maxm];11 int first[maxn],d[maxn],work[maxn],q[maxn];12 int e,S,T;13 14 v 阅读全文
posted @ 2013-10-26 19:22 浙西贫农 阅读(136) 评论(0) 推荐(0)
摘要:题意:老师要把N颗糖分给M个小盆友,M*N的矩阵中的元素(i,j)表示第i个小孩对第j颗糖的喜好,1表示喜欢,0表示不喜欢。如果一个小朋友得到了一颗糖,并且这颗糖是自己喜欢的糖,他会得到K个glad值,否则,只能得到1的glad值。现在告诉你每个小朋友i的glad值要达到B[i]才会开心,问是否存在一种分配方案使得所有的小朋友都能够开心。(1sum(B[i])是不是成立,如果成立就可以给出一个分配方案。maxflow流的意义是所有孩子被分到喜欢的糖的前提下的最大的glad值之和-这些孩子喜欢的糖的数目,那么再加上所有糖的数目n就是能够总体能够达到最大glad值了。这里,glad值的范围变成了[ 阅读全文
posted @ 2013-10-26 18:27 浙西贫农 阅读(212) 评论(0) 推荐(0)
摘要:题意:水面上有很多的圆形区域,他们要么存在相交的区域,要么不存在相交的区域,不会存在相切的情况。每个区域都有颜色,并且告诉你每个区域颜色的频率。现在要求你从唯一的一个红色区域(频率最小)走到紫色区域(频率最大)并从紫色区域返回红色区域。并且必须遵循以下三个规则:(1)从红色走到紫色的时候,必须从频率小的区域走向频率大的区域。(2)从紫色走到红色的时候,必须从频率大的区域走向频率小的区域。(3)除了初始的红色区域,你每离开一个区域的时候,那个区域都会消失。问你是否存在一个合法的方式。这里最关键的问题是要形成回路。首先,如果红色区域跟紫色区域直接相交,那就直接可以判为存在合法方案了。如果不想交,首 阅读全文
posted @ 2013-10-26 12:20 浙西贫农 阅读(562) 评论(0) 推荐(0)
摘要:题意:给出一张n个点m条边无向图,问最少删几个点使得原图非连通。无向图不带权的点连通问题。拆点,对每个点i,对应边(i,i',1),对原图中的每条边(i,j),对应两条正向边(i',j,inf),(j',i,inf),选定任意一个源点S',枚举所有汇点T,跑最大流,对最小的最大流ans,如果ans=inf,则答案就是n,否则答案是ans。代码: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #define maxn 110 7 #define inf 1 q; 17 q.push(t); 18 阅读全文
posted @ 2013-10-25 22:09 浙西贫农 阅读(190) 评论(0) 推荐(0)
摘要:题意:n(n 2 #include 3 #include 4 #include 5 #define INF 1<<30 6 #define maxn 1100 7 #define maxm 30000 8 using namespace std; 9 10 int v[maxm],next[maxm],w[maxm]; 11 int first[maxn],d[maxn],work[maxn],q[maxn]; 12 int e,S,T; 13 int bit[maxn],count_bit[maxn]; 14 void init(){ 15 e = 0; 16... 阅读全文
posted @ 2013-10-25 10:55 浙西贫农 阅读(236) 评论(0) 推荐(0)
摘要:题意:看图就知道大概是个什么意思了,就是每行连续的数之和等于一个规定的数,每列连续的数之和等于一个规定的数。 神题啊。。这都可以是网络流。。貌似也只能是网络流了。。直接搜的题解。。觉得建图也不是那么神奇 但是就是觉得真的不可思议。。首先,流量有下界,是1,那么干脆所有的边的流量都把这个1的部分减掉。直接贴这个博客上说的:http://www.cnblogs.com/ylfdrib/archive/2010/08/15/1799903.html建图:一共有四类点:1. 构造源点S,汇点T2. 有行和的格子,此类节点设为A3. 空白格,设为B4. 有列和的格子,设为C则可以建边:1. 容... 阅读全文
posted @ 2013-10-24 22:37 浙西贫农 阅读(258) 评论(0) 推荐(0)
摘要:题意:有N个任务和M台机器。对于每个任务i,它必须在第Si天或之后开始执行,完成这个任务需要Pi天,并且必须在第Ei天或其之前完成。一台机器在同一时间段内只能做一个任务,一个任务在同一时间段内也只能被一台机器执行。任务可以被打断执行,可以在不同的时间在不同的机器上进行。现在给出这些数据,问是否有可行的调度方案。每天每台机器只能完成一个工作量,那么把这个工作量作为流量是比较合理的。题目里面有三个量,时间,机器,任务。注意,根据题意,每台机器每天只能完成一个工作量,我们可以说每天给我M台机器我可以每天完成M个工作量,因此只要保留两个量作为图中的点:天数,任务,图中的流量对应工作量。那么对于所有任务 阅读全文
posted @ 2013-10-24 12:03 浙西贫农 阅读(278) 评论(0) 推荐(0)
摘要:题意:给出一个n个数字的序列,求最长上升子序列长度,并求出最多可以找出多少个最长上升子序列(每个位置上的数字只能在找出的序列中出现一次)只能出现一次,还是可以联想到最大流的。而对于一个已经给定了的长度,貌似想控制在网络中的路径长度不太可能。假定每个位置上的当前最长上升子序列的标记为dp(i)。每个流会对应一种物理方案,那么必须是dp(j)=dp(i)+1,(j>i),所以,对于所有的符合条件的i,j,有边(i',j,1)。另外由于是每个数字只可以使用一次,所以肯定对应一条边(i,i',1),对于所有dp(i)=1的点,对应边(S,i,1),对于所有dp(i)=ans的点, 阅读全文
posted @ 2013-10-24 10:13 浙西贫农 阅读(273) 评论(0) 推荐(0)
摘要:题意:给出一张F个点P条路径的带权无向图,权值代表走这条路的时间。每个点F上现在有a头牛,而每个点最多可容纳b头牛,问是否存在一种调整方案使得所有的点上存在的牛数少于该点容纳牛数的上限,如果可以,输出最短时间,否则,输出-1。思路:拆点,二分。先做一遍floyd。把每个点拆成i,i',有边(i,i',inf)。二分枚举时间t,如果可以在t时间内从i走到j,那么从i到j’连一条边(i,j',inf)。跑最大流,如果满流(就是maxflow=总牛数),即成立。 1 #include 2 #include 3 #include 4 #include 5 #define INF 阅读全文
posted @ 2013-10-23 16:28 浙西贫农 阅读(207) 评论(0) 推荐(0)
摘要:POJ 3686 费用流或KM。一个工厂接到了N张订单。他们有M个车间,如果第i张单在第j个车间加工需要花费Zij的时间。现在给出这个Z的矩阵,问做完这N张单需要时间的平均值(总时间/N)包括等待时间。(比如说我在一个车间连续以1个时间单位接了3张单,那么总时间为1+2+3=6,平均值为6/3=2)(N,MT不连通,则称这个点key vertex。问这张图中有多少个点是key vertex。代码:http://122.207.68.93:9090/csuacmtrain/problem/viewSource.action?id=12799HDU 3491 最小割:给出一张无向图,每个点上都有一 阅读全文
posted @ 2013-10-23 14:45 浙西贫农 阅读(393) 评论(0) 推荐(0)
摘要:题目大意:给出一张N+1个点和M条边的带权有向图,代表有N+1个城市和M条路,在0有警察局,1-N这些城市有犯罪分子,现在给你K个条子,从0从发,要求按从小到大的顺序依次收拾掉这些犯罪分子,每个条子到达一个城市的时候,他可以收拾这里的人,也可以不收拾,但绝不能让第i+1个城市的人早与第i个城市的人被干掉,求让这些人从0出发完成任务后回到0的走过的最短路之和。解法:这里给的K个条子可以不用完。。所以有两条边(S,0,K,0),(0,T,K,0)。然后为了保证每个点都被遍历到,需要拆点建边,并且保证这条边一定会走到(i,i',-oo,0)。对于城市1-N,从0出发最后要回到0,对应两条边( 阅读全文
posted @ 2013-10-15 22:44 浙西贫农 阅读(188) 评论(0) 推荐(0)
摘要:题目大意:给出计算GPA的公式。现在又N天时间,每天有k节课,每节课上,你只能复习一门课程,复习之后,该门课程的成绩可以提高1分。当然你也可以花好几节课的时间在一门课程上来使得这门课的成绩提高的更多,但是课程的得分不能超过100。然而,不是每节课上你想复习什么课程就可以什么课程,每天你只能复习一些课程。现在要你去把GPA刷高,前提是不能有挂科( 2 #include 3 #include 4 #include 5 #define maxn 110 6 #define maxm 3010 7 #define INF 100000 8 using namespace std; ... 阅读全文
posted @ 2013-10-15 20:09 浙西贫农 阅读(237) 评论(0) 推荐(0)
摘要:神奇的偏移量啊。其实一点也不神奇。。直接上KM就是了。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #define maxn 105 7 using namespace std; 8 9 struct KM 10 { 11 vector G[maxn]; 12 int W[maxn][maxn],n; 13 int Lx[maxn],Ly[maxn]; 14 int left[maxn]; 15 bool S[maxn],T[maxn]; 16 17 ... 阅读全文
posted @ 2013-10-14 21:25 浙西贫农 阅读(247) 评论(0) 推荐(0)
摘要:LRJ老师白书2上讲网络流的例题,只不过没有给出题号,今天偶然发现了这道题。这里,费用随流量的变化而变化,且正好与流量的平方成正比,可以巧妙的将原本1,4,9,16,25的5种不同情况下的费用拆成5条容量为1的边,他们的费用分别为1,3,5,7,9。因为每次增广的时候,肯定会选择去走费用最小的边,比如说走了cost=1的边之后,如果要再走这条路,肯定会去走cost=3的边(不可能去走cost=5,7,9的边),这样一来,把两条边加起来就是flow=2,cost=4。 1 #include 2 #include 3 #include 4 #include 5 #define maxn 1... 阅读全文
posted @ 2013-10-14 19:52 浙西贫农 阅读(184) 评论(0) 推荐(0)
摘要:拆点跑费用流 1 #include 2 #include 3 #include 4 #include 5 #define maxn 2010 6 #define maxm 10100 7 #define INF 1 Q; 34 for(int i = 0;i 0 && d[u] + cost[i] < d[v[i]]){ 41 d[v[i]] = d[u] + cost[i]; 42 pre[v[i]] = u;pos[v[i]] = i; 43 ... 阅读全文
posted @ 2013-10-14 19:08 浙西贫农 阅读(154) 评论(0) 推荐(0)
摘要:POJ 1386 判断有向图中是否存在欧拉回路 1 #include 2 #include 3 #include 4 #define maxn 30 5 using namespace std; 6 int fa[maxn],used[maxn],in[maxn],out[maxn]; 7 int find(int x){return x == fa[x] ? x : fa[x] = find(fa[x]);} 8 void Union(int a,int b){ 9 int x = find(a);10 int y = find(b);11 if(x != y)... 阅读全文
posted @ 2013-10-11 09:47 浙西贫农 阅读(206) 评论(0) 推荐(0)
摘要:【题目大意】N个盒子围成一圈。第i个盒子初始时有Ai个小球(∑Ai1则连边(s,i,Ai-1,0);若Ai=0则连边(i,t,1,0)。对任意两个盒子i,j,若Ai>1并且Aj=0,连边(i,j,∞,min(|i-j|,n-|i-j|))。求一次最小费用流即为结果。但是这样构图复杂度会很高,边数会达到O(N^2),不够聪明。更加简洁的方法是直接由每个盒子向与其相邻的两个盒子连边(i,j,∞,1),总共也才2N条,将边数降到了O(N),由TLE变成AC。以上摘自Edelwiss《网络流建模汇总》其实一开始基本上不会往那个T的方向去想。总之还是每种方案会对应一条边。 1 #include 2 阅读全文
posted @ 2013-10-09 09:25 浙西贫农 阅读(229) 评论(0) 推荐(0)
摘要:这题的费用流模型应该很明显,已知从起点开始一共可以走k次,那么容量就有了。对每个点,把他拆成(i,i'),因为点上的权只能取一次,以后再经过这个点的时候,权值为0,所以这里就对应了两条边(i,i',1,-w),(i,i',k-1,0)。另外,对于所有i点能够到达的点j,对应一条边(i',j,k,0)。跑一遍最小费用流再取反即为结果。 1 #include 2 #include 3 #include 4 #include 5 #define maxn 5010 6 #define maxm 100010 7 #define INF 1 Q;34 for(int i 阅读全文
posted @ 2013-10-09 08:59 浙西贫农 阅读(159) 评论(0) 推荐(0)
摘要:传说中的区间k覆盖问题。给定n个带权开区间,选择其中一些使得区间权值之和最大,且所有区间内任意点被覆盖不能超过k次。建图方法:1.将区间离散化,对于离散化后的区间端点所对应的点i,i+1,加边(i,i+1,k,0)2.对于每个区间(a,b),所对应离散化后的点(xx,yy),加边(xx,yy,-w,1),w为区间的权值3.由源点src连一条到一个点的边(src,1,k,0),同理,由最后一个点t连一条道汇点sink的边(t,sink,k,0)跑一遍最小费用了取反即为结果。 1 #include 2 #include 3 #include 4 #include 5 #defin... 阅读全文
posted @ 2013-10-08 12:20 浙西贫农 阅读(132) 评论(0) 推荐(0)
摘要:传说中的带权有向图上的中国邮路问题。【题目大意】带权有向图上的中国邮路问题:一名邮递员需要经过每条有向边至少一次,最后回到出发点,一条边多次经过权值要累加,问最小总权值是多少。(20的点,加边(s,i,Di,0);对于Di0的边(i,j),在原图中复制fij份,这样原图便成为欧拉图,求一次欧拉回路即可。以上摘自Edelweiss《网络流建模汇总》启示:这篇论文的前面还讲到一个混合图欧拉回路的问题(就是给出一张既含有有向边又含有无向边的图,问你是否能通过确定图中一些无向边的方向使得图中存在欧拉回路),这种涉及到回路的问题,都要抓住每个点的出度和入度这两个非常重要的条件来构图。 1 #inclu. 阅读全文
posted @ 2013-10-06 19:32 浙西贫农 阅读(473) 评论(0) 推荐(0)
摘要:限制增广次数的费用流。【题目大意】一个N*N的网格,每个单元都有一个价值Vi的宝物和一个高度Hi。现在ZhouGuyue要作至多K次旅行,每次旅行如下:他可以借助bin3的直升机飞到任意一个单元,之后他每次只能向相邻的且高度比当前所在格子低的格子移动。当他移动到一个边界的格子上时,他可以跳出这个网格并完成一次旅行。旅行中所到之处的宝物他可以全部拿走,一旦拿走原来的格子里就没有宝物了。问他最多能拿走价值多少的宝物。(1Hj则加边(i’’,j’,∞,0);若格子i在边界上则加边(i’’,t,∞,0)。限制增广次数小于等于K求最小费用流即可。以上摘自Edelweiss《网络流建模汇总》启示:1.增广 阅读全文
posted @ 2013-10-06 16:12 浙西贫农 阅读(346) 评论(0) 推荐(0)
摘要:题意:求两条从s->t的路径,使得两条路径不能经过相同的点和边,且两条路径长度之和最小。其实一看到所有点和边只能经过一次,就很容易想到费用流了。拆点,将每个点拆i成(i,i')。对于原图中的每个点,连一条(i,i',1,0)的边,对于原图中的每条边(u,v),连一条(u',v,1,w)的边(w为边的权值),然后添加源S->i',cost=0,cap=2的边(S,i,2,0)的边,添加汇点T,同理,建一条(t,T,2,0)的边,跑一次最小费用最大流就可以得到答案了。其实这题很简单,但是我比赛的时候逗比了。。居然忘记了对源点容量的限制,另一方面我费用流写 阅读全文
posted @ 2013-10-06 14:15 浙西贫农 阅读(251) 评论(0) 推荐(0)
摘要:传说中的凸费用流问题,对于一条有c1容量免费,超出容量部分增加的每单位流量费用为c2的边(u,v),在原图中拆成两条边(u,v,c1,0),(u,v,INF,c2)。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #define maxn 1010 7 #define maxm 200010 8 #define INF 0x3f3f3f3f 9 using namespace std; 10 typedef long long LL; 11 int N,M,C,P; 12 struct MCMF{ ... 阅读全文
posted @ 2013-10-06 13:34 浙西贫农 阅读(209) 评论(0) 推荐(0)
摘要:题意:给出一个只含01的字符串,然后用s(i-1) xor s(i+1)的结果去更新s(i),最后问能否将原串更新成全部为0的字符串。一拿到就觉得这应该是找规律题,经过简单的推理,可以得到这么一些结论:1.当字符串长度为1,3,7的时候,无论原串是什么,分别最多做1,3,7次操作,总能变成全部为0的串(YY:只要字符串的长度为2^n-1,无论原串是什么,总能变成全部为0的串)2.当字符串长度为偶数时,除非原串本身全为0,否则不可能将原串更新为全部为0的串(这个能证出来,倒着推一下就行了,给出一个长度为偶数且全为0的串,向上推一个可行的状态,让它不仅含有1而且还可以变成全部为0的,这是不可能的) 阅读全文
posted @ 2013-10-03 18:30 浙西贫农 阅读(404) 评论(0) 推荐(0)
摘要:一看到这个题就知道是最大闭合子图了,关于最大闭合子图的定义和建图,都是看胡伯涛的论文上的。这里有两问,首先是要求闭合图权最大,第二问,也是比较有难度的就是在闭合图权最大的条件下,尽量多的让dream所代表的点出现在最大权闭合图的闭合图中。最大闭合图是最小割模型的一个应用。由于一个流网络的最小割可能不唯一,所以最大闭合图也不一定是唯一的,所以第二问的难度就增加了。这里的解决方法是借助偏移量来维护两个量,一个是最大流,一个是用到的点数。由题意可得,图中点数最多将达到2002,那么现在选择一个MOD=3000的偏移量。首先要统计图中所有点权为正的点的权和sum。建图的时候,对于每个价值为value的 阅读全文
posted @ 2013-10-02 19:50 浙西贫农 阅读(258) 评论(0) 推荐(0)