2011年8月15日

图论/最短路径

摘要: pku3072:题目大意,给定n个点,求一个机器人从点1到点n的最少用时,机器人每步走过的距离不能超过r,沿着某个方向到达一个点后,如果想到达另一个点,那么需要转过一定的角度朝向那个点才行(可能转过0度)。解法:最短路径DP,令dis[v][u]表示从起点1经过某些顶点后到达u,再到达v的最短用时,则dis[v][u] = Min{d[v][u], dis[u][j]+map[u][v]+turnDis(p[j], p[u], p[v])}。方程比较简单,关键是turnDis(p[j],p[u],p[v])怎么算,也就是说转过的角度。我是这么做的,假设p[j]->p[u]形成向量(x1, 阅读全文

posted @ 2011-08-15 11:30 Moon_1st 阅读(375) 评论(0) 推荐(0) 编辑

2011年8月14日

pku2949——分数规划/图论

摘要: 题目大意:给定一堆字符串,如果第一个字符串的后两个字母和第二个字符串的前两个字母相同,那么可以把他们俩接起来,求平均长度最大的一个环。看到题目第一反映就是——这是个图论问题。建图也比较好想一点,做过一些欧拉回路问题的同学肯定都会。关键是求最大平均值,需要利用分数规划。关于分数规划的介绍请看2007年胡伯涛的OI论文(1.6小节)。在这个问题里面我们需要最大化目标函数 Max{r | r = sigma(w[i])/len}(len为环的长度,w[i]为边权),我们构造函数g(r) = Max{sigma(w[i])-r*|w|} = Max{w[1]-r+w[2]-r+...+w[len]-r 阅读全文

posted @ 2011-08-14 21:11 Moon_1st 阅读(308) 评论(0) 推荐(0) 编辑

2011年8月12日

图论——2SAT

摘要: SRM464 DIV1 500pt:比较裸滴,二分+2SAT判定。由于数据量很小,floyd足矣~View Code #include <iostream>#include <cstdio>#include <cstring>#include <vector>usingnamespace std;class ColorfulDecoration{public: conststaticint inf =1000000000; bool map[105][105]; int abs(int x) { if(x <0) x =-x; return 阅读全文

posted @ 2011-08-12 09:44 Moon_1st 阅读(2028) 评论(0) 推荐(0) 编辑

2011年8月11日

图论——匹配

摘要: pku2594:题意:给定一个DAG,求最少用多少条路径可以覆盖所有的点,路径可以相交。解法:如果去掉路径可以相交这个条件的话,就是裸的求最小路径覆盖。回想求解最小路径覆盖的原理——假设开始把每个节点单独拿出来分别作为一条简单路径- -!,每增加一条匹配,就会相应的增加某条简单路径中的一个中间节点/头节点,即减少一个尾节点,即减少一条路径,那么最大匹配即是最多可已减少多少条路径,所以最小路径覆盖数=|V|-|M|(匹配数)。对于这个问题,如果我们还按那种原理计算的话——即增加一条匹配边对应增加一个头/中间 节点,那么需要先用floyd预处理一下连通性,然后就可以利用最大匹配来做了。容易证明在新 阅读全文

posted @ 2011-08-11 11:00 Moon_1st 阅读(475) 评论(0) 推荐(0) 编辑

2011年8月10日

图论——强连通分量

摘要: pku2553:题目大意:给定一个n个节点,m条边的有向图。对某个节点v,如果从它能到达的节点w,那么从w也能到达v;这样的节点称为sink。求出图中所有的sink并排序输出。解法:很明显和强连通分量有关,缩点后形成一张DAG图,所求既是出度为0的缩点对应的原始点。View Code #include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <algorithm>usingnamespace std;constint N =5010; 阅读全文

posted @ 2011-08-10 21:36 Moon_1st 阅读(331) 评论(0) 推荐(0) 编辑

TC SRM 514 DIV2

摘要: 第一次用新号做SRM~首先,咳咳,很高兴能跟方方同学一起做SRM~这次总共做了3个,但只交上了两个,1000pt的那个想到算法了,代码也写完了,不过test时发现有两组数据出问题,于是debug。。。时间不够啦。。只能赛后补上啦,rating到了1433~250pt是个简单的几何题,不需要啥技巧,仅仅需要判断点是否在正方形的 里面/上下边界内的右边/上下边界内的左边/左右边界内的上边/左右边界内的下边/其他,然后针对每种情况返回一个值就可以了。500pt是个判定性问题,判断n-knight jump是否能从点(0, 0)到点(x,y)。由于数据量比较小,偶直接用裸bfs水过去了。没想到那题是有 阅读全文

posted @ 2011-08-10 15:27 Moon_1st 阅读(255) 评论(0) 推荐(0) 编辑

2011年8月9日

图论——容量有上下界的网络流

摘要: pku2396:这个题是个典型的容量有上下界的网络流问题。假设您已经对最大流的原理很了解,那么请继续看:关于这种问题的解法,请看这篇论文,讲的很好。http://wenku.baidu.com/view/0f3b691c59eef8c75fbfb35c.html如果这篇论文看得没有问题了,那么我们来谈一下建图。显然所有行的和与列的和是相同的,这是什么——网络流的流量平衡。但是行和列中每个元素怎样限定呢?一种做法是:将每行、每列及每个元素看成一个点,然后把每个点拆成两个点,中间限制流量。。。。但是这样做点数有2000多个。。。。有点太大了~~ 第二种做法:只将每一行和每一列看成一个节点,中间连. 阅读全文

posted @ 2011-08-09 14:40 Moon_1st 阅读(2205) 评论(0) 推荐(1) 编辑

2011年8月8日

图论——最大流

摘要: pku2391:感觉这是一个不错的最大流的题目。题目大意:有n个农场和m条连接这些农场的路径,牛们走过某条边时都需要一个时间(也就是每条边有一个权值)。牛是很怕下雨的,每个农场有一个牛棚,用来避雨。每个农场两个参数——一个是当前这个农场里牛的个数,另一个是这个农场的牛棚可以容纳的牛的个数。每头牛均可以走到其他农场去避雨,现在暴风雨就要来了,问牛们最少需要走多长时间才能保证每头牛都不会被雨淋到,如果无解则输出-1.解法:看完题目之后大致有两种思路,一种是贪心——每次寻找最短路,类似于最小费用流每次寻找最小费用路。注意此处和最小费用流是不同的,最小费用流最优化的值是:sigma(f(i,j)*co 阅读全文

posted @ 2011-08-08 16:52 Moon_1st 阅读(715) 评论(0) 推荐(0) 编辑

Codeforces Beta Round #80 (Div. 2 Only)

摘要: 第一次做Codeforces的比赛,和TopCoder是不大一样。。。。第一题:我反复看了5、6分钟的题,到最后得出一个结论——这个题确实是这么水的一个题。。。主体代码就3行cin && cout 。。。。第二题:题目背景有点奇怪。。。本质就是给定n个数a1,a2,a3.....an,然后求一下[1+(a1-1)*1]+[1+(a2-1)*2]+[1+(a3-1)*3]+...+[1+(an-1)*n],输出就可以了,注意long long 的使用。第三题:和前面两道题一样。。。不知道出题人怎么想的。。。要把题目描述成这个样子。。。。实质含义就是,判断一个图是否是这样构成的:1 阅读全文

posted @ 2011-08-08 09:36 Moon_1st 阅读(469) 评论(0) 推荐(0) 编辑

2011年8月6日

pku1904——二分图/增广链/强连通分量

摘要: 首先赞一下这道题,的确是个好题。题目大意:一个国王有n个王子,同时有n个女孩。每个王子都有自己喜欢的若干个女孩,现给定一个合法的完备匹配(也就是一个王子娶其中一个自己喜欢女孩),求每个王子可以选择哪些女孩可以让剩下的每个王子依旧能够选择到自己喜欢的一个女孩。题目有点绕。。但确实是这样的意思。。。。解法:首先我们看最直观的想法——也就是枚举+二分匹配判定。但是点数n高达2000,边数e高达200000;所以枚举的复杂度O(e+n)*O(n^2)=O(n^2 * (e+n)),太大了,显然超时。但是有没有可以优化的地方呢?有的。因为题目已经给定了一个完备匹配,而上述算法还没有利用这个完备匹配。想象 阅读全文

posted @ 2011-08-06 11:15 Moon_1st 阅读(2057) 评论(3) 推荐(3) 编辑

导航