随笔分类 -  POJ

1
摘要:题意:一个工厂接到了N张订单。他们有M个车间,如果第i张单在第j个车间加工需要花费Zij的时间。现在给出这个Z的矩阵,问做完这N张单需要时间的平均值(总时间/N)包括等待时间。(比如说我在一个车间连续以1个时间单位接了3张单,那么总时间为1+2+3=6,平均值为6/3=2)(N,M 2 #include 3 #include 4 #include 5 #include 6 #define maxn 2600 7 #define maxm 1000000 8 #define INF 1 > q; 32 d[src] = 0; 33 q.pus... 阅读全文
posted @ 2013-11-20 21:56 浙西贫农 阅读(144) 评论(0) 推荐(0)
摘要:题意:不想描述了。。直接从这个博客抄了:http://www.cnblogs.com/rainydays/archive/2011/07/01/2095634.html有一些机器用来组装电脑,每台机器对输入机器的电脑有要求,符合要求的电脑被送入机器后会输出一台规定配件情况的电脑。而且分别告知每台机器在单位时间内处理电脑的台数。将这些机器连成生产线,问单位时间内出产的具有所有配件的电脑最多有多少台。其实就是个拆点的最大流,然后要求输出所有边的流量有变化的正向边。当然也可以不拆点做。WA了一次,题目有个小坑,就是如果所有输入都是2,那么它还是可以跟源点相连的。 1 #include 2 #i... 阅读全文
posted @ 2013-11-13 23:10 浙西贫农 阅读(166) 评论(0) 推荐(0)
摘要:题意:火星人要攻打地球,火星人将派来一些伞兵来破坏军事设施。已知他们将降落在一个矩阵行的地区,而且知道这些人会降落在哪一行那一列。现在地球人可以造一些大炮来攻击他们,一门大炮可以攻击一行或者一列,一个伞兵只要被他所在的行或列的大炮打中他就会挂,而在每一行、每一列造大炮的价格是不同的,建造大炮总价格等于你选择在某行或某列造大炮价格的乘积。现在要求把所有的伞兵都搞挂了并且让这个价格尽可能的小。看到乘积尽量小,想到了取对数。那么剩下的问题就是二分图点权覆盖的问题了。最后求完最大流之后,再还原这个费用就可以了。 1 #include 2 #include 3 #include 4 #includ... 阅读全文
posted @ 2013-11-12 19:13 浙西贫农 阅读(133) 评论(0) 推荐(0)
摘要:题意:给出一个流网络,问有仅将一条边的容量增大可以使得最大流增大的边有多少条。首先,肯定将是满流的边的容量增大才可能使得最大流增大。但是这些满流的边不一定能是最小割,即使它出现在最小割中,把它的容量增大也不一定能使最大流增大。那么考虑一下求完最大流后不能增广的原因,或者说,怎么样才能在残量网络中增广呢?从S出发,dfs出所有满流的正向边,给dfs经过的点标上f1。再从T出发,逆向dfs出所有满流的边,给dfs经过的点标上f2。那么如果有一条边是这样的:满流且有f1标记和f2标记,那么增加它的容量,残量网络就又可以增广了,最大流会增加,因此这样的边就是我们需要寻找的边。 1 #include . 阅读全文
posted @ 2013-11-10 22:18 浙西贫农 阅读(213) 评论(0) 推荐(0)
摘要:题意:有m个房间,你需要保护第n个房间使得其不被攻入。房间与房间之间会有门,门上有机关,因此当门关上时,只能从一边进入另外一边而不能从相反方向进入。现在告诉你这n个房间以及门的分布情况,以及开始的时候哪些房间里有贼,问至少关掉几个门使得房间n不被攻入。感觉这个题目蛮有意思的。比较容易想到最小割。如果从房间a到房间b有一个门,如果这个门关上了,且门上的机关使得贼只能从a进入b而不能让其从b进入a,那么这里对应两条边(a,b,inf),(b,a,1),如果房间i里面有贼,对应边(S,i,inf),而需要保护的那个房间n就会汇点T。然后求一遍最大流。如果maxflow>=inf就说明不存在合法 阅读全文
posted @ 2013-11-10 17:35 浙西贫农 阅读(208) 评论(0) 推荐(0)
摘要:题意:给出一张有可能自环、重边的有向图。每个节点i上都有两个值Wi+,Wi-,分别表示删掉所有i点的入边需要的代价和删掉所有i点的出边需要的代价。现在要求把所有的边全部删掉,求最小代价。显然一条边只和个点有关,要删掉一条边(i,j),要么付出Wi-,要么付出Wi+,很容易让人想到二分图。其实这就是一个二分图点权覆盖的问题。把每个点i拆为i,i'。对所有的Wi+,对应边(i',T,Wi+),对所有的Wi-.对应边(S,i,Wi-),对于图中所有的边(u,v),对应边(u,v',inf)。然后求最小割就是答案。 1 #include 2 #include 3 #includ 阅读全文
posted @ 2013-11-08 17:02 浙西贫农 阅读(251) 评论(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 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)
摘要:这题的费用流模型应该很明显,已知从起点开始一共可以走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)
摘要:已知图中点数n,边数m1.统计每个点的度数d(i)2.枚举参数g的区间[0,m]3.参数精度要求1/(n^2)4.每次枚举参数的建图:源点为S,汇点为T,addedge(from,to,cap)(1)对每条边(x,y) addedge(x,y,1) addedge(y,x,1)(2)对每个点i addedge(S,i,m) addedge(i,T,m+2*g-d(i))(3)做一次最大流,h=maxflow(S,T)5.若h/2>eps l = mid,否则,r = mid6.用求得的low跑一次最大流,从S点dfs所有没有满流的边,给所有非S,T的点标记,这些点就是最后所求得的点。 1 阅读全文
posted @ 2013-08-17 12:28 浙西贫农 阅读(238) 评论(0) 推荐(0)
摘要:d[i]=区间[0,i)中所有的整点数。得到两个不等式:d[b+1]-d[a]<=c,0<=d[i+1]-d[i]<=1;根据这两个不等式来做差分约束。View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #define maxn 50010 6 #define maxm 150010 7 using namespace std; 8 9 int first[maxn],d[maxn],inq[m 阅读全文
posted @ 2013-01-02 17:06 浙西贫农 阅读(134) 评论(0) 推荐(0)
摘要:静态链表。。STL要超时。。View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <cstring> 5 using namespace std; 6 7 vector<int> G[50001]; 8 int dp[50001],visit[50001],head[50001]; 9 int n,k;10 struct Edge11 {12 int v;13 int next;14 }edge[50001 * 2];15 阅读全文
posted @ 2012-10-15 14:26 浙西贫农 阅读(138) 评论(0) 推荐(0)
摘要:实际上,这个题不难,状态很好写:balace[i]=max(size[j],N-size[i]),其中i是j的父节点,size[i]表示以节点i为根节点所构成子树的节点总数。一遍dfs就可以搞定。题目里给的数据是告诉你每两个节点之间有一条边,而不是父子节点关系。。。View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #define MAX 0xffffff 5 using namespace std; 6 7 vector <int> G[20001] 阅读全文
posted @ 2012-10-11 21:27 浙西贫农 阅读(167) 评论(0) 推荐(0)
摘要:View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using namespace std; 6 7 int n,len; 8 char name[201][101]; 9 int dp[201][2]; 10 int special[201][2]; 11 vector <int> G[201]; 12 13 int max(int a,int b) 14 { 15 if(a > b) re 阅读全文
posted @ 2012-10-09 19:39 浙西贫农 阅读(256) 评论(0) 推荐(0)
摘要:树形DP入门啦。View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using namespace std; 6 7 int n,len; 8 int dp[6001][2]; 9 int value[6001];10 bool flag[6001];11 vector <int> G[6001];12 13 int max(int a,int b)14 {15 if(a > b) retur 阅读全文
posted @ 2012-10-09 19:37 浙西贫农 阅读(153) 评论(0) 推荐(0)
摘要:线段树。各种WA。最后过了,老泪纵横。View Code 1 #include <stdio.h> 2 #define MAXN 100001 3 int col[MAXN * 4],lazy[MAXN * 4]; 4 void update(int cur) 5 { 6 col[cur] = col[cur << 1] | col[cur << 1 | 1]; 7 } 8 9 void pushdown(int cur,int x,int y) 10 { 11 int mid = (x + y) >> 1,ls = cur << 1 阅读全文
posted @ 2012-07-15 17:19 浙西贫农 阅读(146) 评论(0) 推荐(0)
摘要:感谢lzxskjo先生让我“剽窃”他的劳动成果。当然,更要感谢被他剽窃了的那个人。以下引用某论文:一. 什么是单调(双端)队列单调队列,顾名思义,就是一个元素单调的队列,那么就能保证队首的元素是最小(最大)的,从而满足动态规划的最优性问题的需求。单调队列,又名双端队列。双端队列,就是说它不同于一般的队列只能在队首删除、队尾插入,它能够在队首、队尾同时进行删除。【单调队列的性质】一般,在动态规划的过程中,单调队列中每个元素一般存储的是两个值:1. 在原数列中的位置(下标)2. 他在动态规划中的状态值而单调队列则保证这两个值同时单调。从以上看,单调队列的元素最好用一个类来放,不这样的话,就要开两个 阅读全文
posted @ 2012-05-01 14:17 浙西贫农 阅读(484) 评论(0) 推荐(1)
摘要:水题痛彻我心扉,就这样。View Code 1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int a[14]; 6 int i,j,k,num = 2; 7 while(num <= 13) 8 { 9 if(num == 0)10 break;11 for(i = 1;;i++)12 {13 j = 0;14 k = num * 2;15 ... 阅读全文
posted @ 2012-04-20 23:11 浙西贫农 阅读(159) 评论(0) 推荐(0)
摘要:其实跟这个很像UVA的一个coins,但是那个是对每个硬币的使用次数没有限制,这次对这个有限制了。这个限制怎么去破他,我想了好久好久。最终,还是没想出来,悲剧。后来网上搜了一下,发现这题还是楼教主的“男人不容易”系列中“男人八题”里的最简单的一道。 悲催了。记录面值的话,每个面值搜过去就是了。但是这个次数的限制,就需要用另外一种状态去表示他了。最核心的就是这个式子:if(used[j-a[i]]<c[i]) used[j]=used[j-a[i]]+1贴代码:View Code 1 #include <iostream> 2 #include <cstring> 阅读全文
posted @ 2012-04-18 15:59 浙西贫农 阅读(314) 评论(0) 推荐(0)

1