随笔分类 -  HDU

摘要:题意:有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(N0时,表示这条边是古老的桥,u连向v,如果不修这座桥,则只能通过1人,但是如果花费w的费用修桥的话,则通过这座桥的流量便没有限制。桥的总数 2 #include 3 #include 4 #include 5 #define INF 1 maxflow){107 maxflow = tmp;108 mincost = sum;109 }else if(tmp == maxflow){110 if(mincost > sum)111 mincost = sum;112 }11... 阅读全文
posted @ 2013-10-28 17:38 浙西贫农 阅读(192) 评论(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(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)
摘要:题目大意:给出一张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)
摘要:作为一个刚入门网络流的弱菜,表示看到这个题,实在建不出图。直接在discuss看的别人怎么建图的。既然看了别人的建图方法,那只能讲讲目前的理解了。题意: 给定一个 n * m 大小的矩阵, 矩阵中每个格子都有一个不大于 1000 的正整数,现在要从矩阵中选出若干个格子, 使得得分最大. 得分等于选取的格子里的数字和. 如果有两个格子相邻, 则得分将减去 2 * (x & y), x 和 y 为相邻两个格子内的数字. 此外, 还有一些格子是必选的.二分图最小点权覆盖的建图方法:建立超级源点S和超级汇点T,对于二分图X,Y中的点,从S向X连一条容量为X权值的边,从Y向T连一条容量为Y权值的 阅读全文
posted @ 2013-08-08 18:32 浙西贫农 阅读(277) 评论(0) 推荐(0)
摘要:白书二代上提到了无源无汇有容量下界网络可行流和有容量下界网络的s-t最大/最小流问题。但是由于本人智商捉鸡,觉得LRJ大神写的似乎不是很好理解,所以只能找一些题目来帮助自己理解理解了。这里直说方法,证明。。。不会。1.无源无汇有容量下界可行流这个问题的解法在周源的那个论文里讲的很清楚了。对于每条边,都有一个容量下界b和一个容量上界c,那么这条边实际的可行流量只有c-b,剩下的b必须满流。对每个点i,求a = sum(流向它的下界流)-sum(从它流出的下界流量)若a>0,从源点0连一条到i的容量为a的边若a 2 #include 3 #include 4 #include 5 #... 阅读全文
posted @ 2013-08-06 20:15 浙西贫农 阅读(441) 评论(0) 推荐(1)
摘要:给这题跪了。先是各种暴栈,然后又是各种WA,看来还是对题目的理解有点问题。题意:给出一张无向图,然后让你在图中加一条边,使得图中剩下的桥最少。思路:求边双连通分量,缩点后形成一棵树。然后求树的最长的两条链(这两条链不能交叉,应该说同根吧)。鄙人跪就跪在重边这里了。如果节点1-2之间有一条重边,则1和2属于同一边双连通分量。。 1 #pragma comment(linker, "/STACK:10240000000,10240000000") 2 #include 3 #include 4 #include 5 #include 6 #include 7 #includ.. 阅读全文
posted @ 2013-08-06 19:38 浙西贫农 阅读(174) 评论(0) 推荐(0)