
poj
文章平均质量分 63
RookieGD
游戲開發學習
展开
-
poj3204 Ikki's Story I - Road Reconstruction
题意:有一个国家,有一个物资提供城市(编号为0),它负责通过城市间的路线向该国首都(编号为n-1)传送物资,但这些城市间的路线上传送的物资的量是有限的,所以传到首都的物资太少,所以国王想花钱修某些城市间的道路,使之传送的物资量增多以增加首都物资获得量。为了避免浪费钱力,他想找出那些只要重建(扩建)就能使首都物资获得量增加的道路。问这样的道理有几条。思路:既然首都的物资获得量在未扩建前有原创 2012-08-02 03:30:51 · 1048 阅读 · 0 评论 -
poj 1236 Network of Schools
题意:给定一个有向图,求下面两个量:1 :最少从几个点出发能遍历全图。2 :最少加几条边能使原图强联通。解法:“最少从几个点出发能遍历全图”的点数是将原图缩点后入度为零的点的个数。“最少加几条边能使原图强联通”的边数是将原图缩点后出度为零的点和入读为零的点中的最大值。(注意强联通图的情况)#includeusing namesp原创 2012-08-10 16:49:07 · 508 阅读 · 0 评论 -
poj 1325 Machine Schedule
一开始觉得没有思路,后来发现,任何一个job都可以和两端的机器的方法各有一条连线,那么路径数即为job的个数。因此,求出覆盖所有路径所需的最小点数即为解。便转化为最小点覆盖问题。/* 题意:有两台机器A和B,分别有n种和m种不同的模式,有k个工作,每个工作都可以在 那两个机器的某种特定的模式下处理,如job[0]既可以在A机器的3号模式下处理, 也可以在B机器的4号模式下处理,机器的工作原创 2012-08-12 09:30:50 · 484 阅读 · 0 评论 -
poj 1422Air Raid
最小路径覆盖,给定一个有向图,在这个图上的某些点上放伞兵,可以使伞兵可以走到图上所有的点。且每个点只被一个伞兵走一次。问至少放多少伞兵。我们可以把问题转化为,在图上的边中选出一些边,使得每个点的如度与出度都不超过1。我们开始在图上的每个点都放上伞兵,然后每选出一条边,就意味着有一个伞兵可以被取消掉了。也就是说需要的最少伞兵数=点总数-能选出的最大边数。我们只要求最大边数即可原创 2012-08-12 10:49:08 · 512 阅读 · 0 评论 -
poj1840 Eqs
使用hash实现,原式:a1*x1^3+a2*x2^3+a3*x3^3+a4*x4^3+a5*x5^3=0可以推出:a1*x1^3+a2*x2^3 = -(a3*x3^3+a4*x4^3+a5*x5^3) 把O(n^5)转化为O(n^3)+O(n^2)了#includeusing namespace std;short h[25000001];int main(){ int a1原创 2012-08-11 14:24:12 · 411 阅读 · 0 评论 -
poj3565 Ants
使用KM算法,我写过一个,思路是把蚂蚁和树分为两个集合,但是莫名其妙的错了,然后在网上又查了一段代码,和我的方法相同,甚至代码内容差不多,但人家A了,郁闷啊。。。求助。错误代码:#include#includeusing namespace std;const int MAXN = 101;const int inf = 0x3ffffff;double edge[MAXN][M原创 2012-07-28 21:44:52 · 642 阅读 · 0 评论 -
poj2195 Going Home
题义:在一个图上,n个人回n个家,可以路过家门而不进去,图中m代表人,H代表家,每人走一步,需要花费1元,求要是这些人都回家,最少花多少。分析:看到题目后首先可以想到的就是人和家是2个集合,人不能与人相连,家也不能与家相连,那么就可给人和家编号,从而构造出一幅2分图,由于可以过门而不入,就说明途中没有障碍物,这就意味着不必去广搜,直接找坐标之间的关系,来确定两点之间的开销。只是一道KM算法原创 2012-07-28 13:43:31 · 1168 阅读 · 0 评论 -
poj2446 Chessboard
判断是否是完全匹配,和poj3020相似,给格子编号,由于水平不够效率很低,很多大神用的完全匹配,有一点值得学习,就是根据i+j的奇偶性,把点分成两个集合。#include#includeusing namespace std;bool vis[33*33];int result[33*33];bool edge [33*33][33*33];struct c{ int x原创 2012-07-25 17:04:47 · 688 阅读 · 0 评论 -
poj Drainage Ditches
模版题,很多人A.模版:http://blog.youkuaiyun.com/rookie_algo/article/details/7803313#includeusing namespace std;const int inf = 0x7fffffff;const int MAXN = 210;const int MAXM = MAXN*MAXN;int map[MAXN][MAXN];int原创 2012-07-30 21:41:43 · 465 阅读 · 0 评论 -
poj1459 Power Network
水题,难的的1A。。。网络流SAP,增加一个超级源和一个超级汇,而发电站的最大发电量和用电站的最大用电量分别记为从超级源到发电站的最大流量和用电站到超级汇的最大流量。//428K 469MS#includeusing namespace std;const int inf = 0x7fffffff;const int MAXN = 210;const int MAXM = M原创 2012-07-31 02:15:15 · 481 阅读 · 0 评论 -
poj 2762 Going from u to v or from v to u?
题意:给出一幅有向图,要求判断,判断在这幅图中的任意两点x,y,一定有一条路可以从x到y或从y到x。思路:缩点+拓扑,一个连通分量一定是满足要求的,那么把连通分量缩成点,拓扑排序,若是在删除某点后,有两个点的入度都为0,则输出No;若能全部删除输出Yes。#includeusing namespace std;const int MAXN =1001;int DFN[MAXN];i原创 2012-08-15 01:05:36 · 1476 阅读 · 0 评论 -
poj2112 Optimal Milking
由于之前没做过多重二分匹配问题,所以一直没有头绪,折磨了我好久,后来看到别人用二分查找+floyd+网络流 来实现,自己也就用这种方法A掉了。具体方法是:1)先用floyd求到任意milking machine到 任意奶牛之间距离2)查找到最长的一条距离,并记录下来为max,那么我们就可以知道,要求的值就是在[0,max]区间3)下面就开始二分查找了,找到0到max之间,最小的原创 2012-08-01 09:22:55 · 1385 阅读 · 0 评论 -
poj1556 The Doors
难点在构图上,每面墙的两个门,都有四个顶点,可以和其他点相连(如果中间没有墙阻挡),因此就可以成功构造出一幅图。#include#includestruct point{ double x,y;}p[200];struct segment{ point a,b;}s[200];double g[200][200];int t;double cross(point原创 2012-08-25 14:10:33 · 638 阅读 · 0 评论 -
poj1386 Play on Words
使用并查集判断连通性,然后再找欧拉通路。#include using namespace std;int n;char st[1005];bool exist[30];int in[30], out[30];int father[30];int find_father(int a){ if (father[a] == a) return a;原创 2012-08-26 09:53:54 · 556 阅读 · 0 评论 -
poj 2186 Popular Cows
使用Tarjan+缩点 完成,算是一道水题,但这题貌似不能用邻接矩阵,会超内存,所以我使用了链表。大概的思路就是求出所有的强联通分量,然后把强联通分量缩为一个点,判断这些新点的出度,如果只有一个出度为0,则输出这个点代表的联通分量中所有点的个数;如果有多个出度为0的点,则输出0。#includeusing namespace std;const int MAXN =10001;int原创 2012-08-08 22:56:07 · 495 阅读 · 0 评论 -
poj 2553 The Bottom of a Graph
题意:给一个定义bottom(G)={v∈V|∀w∈V:(v→w)⇒(w→v)},意思就是在一个有向图中存在一种点v1,这种点满足:v1可达的点集V中所有点,都有一条路径回到v1。先要找出所有的点,按字典序输出。思路:找到出度为0的强联通分量,按字典叙输出其中的点。#includeusing namespace std;const int MAXN =10001;int DF原创 2012-08-09 03:55:13 · 420 阅读 · 0 评论 -
poj3020 Antenna Placement
还是一道二分图最大匹配问题,求最小路径覆盖,解题的关键在于如何把城市图转化为二分图。由于题目说,最多覆盖两个城市,可知每两个邻接的城市之间都会有关系。因此把城市编上号就可以构造出一个二分图了。我们需要找的是“最少的关系覆盖所有顶点”,很容易联想到的就是最小路径覆盖。公式:最小路径覆盖 = 顶点数 - (最大二分匹配/2)这是别人写的公式证明:http://hi.baidu.com/soon原创 2012-07-25 13:33:06 · 421 阅读 · 0 评论 -
poj Secret Milking Machine
题意:有n个点,之间有p条路径(无向,可重复),要求求出要同时存在T条路径(每条边都不重复的条件下),路径中边的最短距离。方法:二分搜索+最大流,二分枚举所有的距离,求出最短的,再构造网络(存在一条边两点之间的通路小于枚举值,两点间的流量自加1),最后的最大流如果是大于#include#includeusing namespace std;const int inf = 0x7fffff原创 2012-08-02 21:17:18 · 572 阅读 · 0 评论 -
poj2586
主要是题意理解比较难。 题意:对于MS Inc来说,每个月如果盈利则必盈利sur,如果亏空则必亏空def(这个公司很怪)。它每五个月进行一次统计,共统计八次(1-5月一次,2-6月一次...)。统计的结果是这八次都亏空。判断MS Inc全年否能盈利,如果能则求出最大的盈利。如果不能则输出"Deficit"。#includeusing namespace std;int main原创 2012-07-20 23:31:34 · 1822 阅读 · 0 评论 -
poj3259
第一次使用bellman-ford,与迪杰斯特拉相比,同样是求单源最短路劲,但是bellman-ford可以求负权最短路。方法就是对边进行松弛操作,这题基本就是算法的实现而已,并没有什么变形。/*bell-manford and spfa*/#include#includeusing namespace std;const int MAXN = 10000;int dis[MA原创 2012-07-20 23:41:21 · 475 阅读 · 0 评论 -
poj2965
又是一道模拟题,采用枚举的方法就可#includeusing namespace std;int i,j,Maze[4][4],min_step;void change(int i,int j){ for(int t=0;t<4;t++) Maze[i][t]++; for(int t=0;t<4;t++) Maze[t][j]++; Maze[i][j]--;}vo原创 2012-07-20 23:36:11 · 459 阅读 · 0 评论 -
poj1062
就是对迪杰斯特拉算法的应用,不同的人代表不同的节点,旅行者作为起点 与其他点之间的权值就是直接购买货物的价格,其他两点之间的权值就是除了换物品外还要加的价格,其中要注意一点,就是这里有等级限制,所以并不是可以把所有点加进去。这里可以用枚举的思路。#includeusing namespace std;const int MAX = 0x7ffffff;const int MAXN = 1原创 2012-07-20 23:58:10 · 441 阅读 · 0 评论 -
poj3295
类似于表达式求值,但是更加简单,仅仅是进行逻辑运算而已,其中非的优先级最高,其他的运算优先级都一样。同时要有一点是要进行枚举,一共p,q,r,s,t 5个变量,分别取0,1则有2^5种情况,分别运算 ,若全为真,则记为永真式。#include#include#includeusing namespace std;bool Judge(int p,int q,int r,int s,原创 2012-07-20 23:47:59 · 943 阅读 · 0 评论 -
poj 2000 水题(JAVA)
题目很简单,就是1+2+2+3+3+3+4+4+4+4。。。。。求和import java.util.*;public class Main { /** * @param args */ static Scanner scan = new Scanner(System.in); public static void m原创 2012-04-02 16:29:36 · 598 阅读 · 0 评论 -
poj 1815 Friendship
拆点法,把一个点拆为两个,之间的流量为点的权值,这样求割点的集合就变为了求割边的集合。#includeusing namespace std;const int maxn=405;const int INF=0x7ffffff;int c[maxn][maxn],dep[maxn],q[maxn],flow[maxn][maxn],num[maxn],pre[maxn];void bfs原创 2012-08-04 19:11:59 · 916 阅读 · 0 评论 -
poj 2983 Is the Information Reliable?
这题参考了别人的思路:由于P A B X 指“确定A到B的距离(边权)为X”从P A B X得到的差分系统为dist[A] - dist[B] >= X && dist[A] - dist[B] 等价于dist[B] 则if(dist[B] > dist[A]-X) 松弛:dist[B] = dist[A]-X由于 V A B指“只知道原创 2012-08-06 10:57:54 · 382 阅读 · 0 评论 -
poj1716 Integer Intervals
初学差分约束,差分约束的概念还是比较好理解的,但是在题目中的应用对我来说还是不熟练。这道题就是用一个数组dis[x]来记录0-X区间内,点的个数,那么列出3个式子:1、s[bi]-s[ai-1]>=22、s[i+1]-s[i]>=03、s[i+1]-s[i]#includeusing namespace std;int dis[10001];struct edge{原创 2012-08-06 09:10:52 · 515 阅读 · 0 评论 -
poj1201
http://blog.youkuaiyun.com/rookie_algo/article/details/7833801和1716一样,差分约束,列出以下式子:1、s[bi]-s[ai-1]>=22、s[i+1]-s[i]>=03、s[i+1]-s[i]#includeusing namespace std;const int MAXN = 50001;原创 2012-08-06 09:58:47 · 483 阅读 · 0 评论 -
poj1789 Truck History(最小生成树)
我是通过prim来做的,代码写得很水,一直超时。。。最后1300ms过的,看到别人用相同的方法的只要300ms,一直搞不懂为啥。我的思路是,把题目转化为求最小生成树。两个truck的不同可以看为两点之间的权值。那么,就可以构造出一幅无相完全图,稠密图一般使用prim算法,求出其生成树的权值和即可。#include#includeusing namespace std;const int in原创 2012-07-21 11:01:51 · 561 阅读 · 0 评论 -
poj2367 Genealogical tree
第一道拓扑排序题,非常水的,就是最基础的实现算法就行。代码如下:#includeusing namespace std;const int MAXN = 105;int edge[MAXN][MAXN];int find_vetex(int T){ int buff; for(int i=1;i!=T+1;i++) { if(edge[i][0]==0) {原创 2012-07-23 04:21:08 · 903 阅读 · 0 评论 -
poj3026 Borg Maze
这题的测试数据非常坑,一直WA,看了discuss才知道是因为,测试数据后面有还有空格,所以在输入x,y之后要加gets(temp),这道题的解决方法是,先用BFS在查找每两点之间的最短距离,构造出一幅无向图,然后再用prim算法,求出这幅图的最小生成树的权值和。还有一个要注意的地方就是,整个room是可以没有墙的,所以要加判断边界条件(我因此RE了几次)。代码如下:#include原创 2012-07-22 16:29:32 · 1301 阅读 · 0 评论 -
poj3041 asteroids
我的第一道二分图匹配题,把矩阵构造为二分图由两部分点集构成,坐标(x,y)出游障碍物即可看为集合A中的x与集合B中的y邻接,问题就转化成为选择最少的一些点(x或y),使得从这些点与所有的边相邻,即转化为了最小点覆盖问题。由二分图最大匹配的König定理:最小点覆盖数 = 最大匹配数。用匈牙利算法即可求值。#includeusing namespace std;const int MAX原创 2012-07-25 09:49:25 · 442 阅读 · 0 评论 -
poj 3343 Against Mammoths
题目超长,难在读题,理解题以后就可以看出是一道二分查找+最大匹配的题目了题意:有n个人类星球,m个外星球,每个星球上开始sh艘飞船,之后每年会生产p艘飞船,人类想要战胜所有的外星球,每个人类星球和每个外星球的距离已知(需要耗费年),比如在a年初,人类星球H向外星球A宣战,那么人类会带上sh+p*a艘飞船进攻,经过k年后到达外星球,这时外星球飞船的数量为sh'+p'*(a+k),如果这时人类飞船原创 2012-08-28 11:17:08 · 1049 阅读 · 0 评论