IT民工
加油!

随笔分类 -  POJ

上一页 1 2 3 4 5 6 下一页
刷集训手册
POJ 1325 Machine Schedule
摘要:http://poj.org/problem?id=1325做的第一道二分图匹配的题,应该说代码是很基础的,但是建模确实需要一定的技巧。这也是黑书上的一个例题,将每个任务看成一条边,把A机器的每个模式看成一个X结点,B机器的看成Y结点。任务i为( ai, bj)。这道题求的是最少的点,让每条边都至少与其中一个点关联。这里有一个结论,这个最少点数就是最大匹配数M,黑书的证明如下:(1) M个是足够的。只需要让它们覆盖最大匹配的这M条边,则其他边一定被覆盖 (如果有一条边e不被覆盖,把e加入后得到一个更大的匹配)(2) M个是必需的。仅仅考虑形成最大匹配的这M条边,由于它们两两无公共点, ... 阅读全文
posted @ 2012-08-06 17:02 找回失去的 阅读(263) 评论(0) 推荐(0)
POJ 3159 Candies
摘要:题意是给A和B发糖果,B的糖果数–A的糖果数<=c,也就是B<=A+c,最后求n比1最多多几个糖果。题目只有这一个约束条件,建图不难。将AB看成有向图的边,然后c看成边的权值,转化成最短路来求解,大牛们都说了SPFA+queue会超时,所以用了SPFA+stack。因为这道题没有负权的边,也可以用堆优化的dij来求这个最短路。SPFA + Stack/*Accepted 2396K 532MS C++ 1363B 2012-08-06 15:32:00*/#include<cstdio>#include<cstring>#include<cstdlib 阅读全文
posted @ 2012-08-06 15:34 找回失去的 阅读(252) 评论(0) 推荐(1)
POJ 3169 Layout
摘要:题意是有N头牛,其中有ML对是相互喜欢的,它们之间不能超过一个距离,有MD对是互相不喜欢的,它们的距离不得少于D。在ML中a,b,c分别代表两头牛的编号和最大距离,有a,b中max–min<=c。而在MD中则反过来min-max<=-c.即max<=min+c,min<=max-c.根据这个条件建图,然后求出第一头牛到第n头牛的距离,如果存在,输出这个距离,如果存在负圈,输出-1,不存在答案输出-2./*Accepted 280K 47MS C++ 1803B 2012-08-06 14:53:35*/#include<stdio.h>#include< 阅读全文
posted @ 2012-08-06 14:08 找回失去的 阅读(223) 评论(0) 推荐(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] <= X 等价于dist[B] <= dist[A] - X && dist[A] <= dist[B] + X则if(dist[B] > dist[A]-X)松弛:dist[B] = dist[A]-X由于 V A B指“只知 阅读全文
posted @ 2012-08-06 13:13 找回失去的 阅读(160) 评论(0) 推荐(0)
POJ 1201 Intervals
摘要:做的第一个差分约束的题。读完题后一脸茫然,不会建图。看了算法导论,其实这是一个建立<=差分约束系统的过程。设s[x]=从0到x的所有在集合中的数的个数,则ai到bi的个数即S[bi]-S[ai-1]。因此有:(1)S[bi]-S[ai-1]>=ci。 又根据s[x]本身的性质,后面的一定不比前面的小,后面的最多比前面多一,有:(2)s[i+1]-s[i]>=0(3)s[i+1]-s[i]<=1根据这三个约束条件建图,使图中每一组边,均满足:S[ai-1]<=S[bi]-ciS[i]<=S[i-1]+1S[i-1]<=S[i]建完图,用Bellman-F 阅读全文
posted @ 2012-08-06 13:08 找回失去的 阅读(299) 评论(0) 推荐(0)
POJ 1509 Glass Beads
摘要:这道题是求字符串最小表示的第一个字符在字符串中的位置。做之前看了IOI2003冬令营周源大神的论文《浅析“最小表示法”思想在字符串循环同构问题中的应用》。这里虽然每个样例只有一个字符串,但是我们可以构造出一个字符串s+1,和s来找同构,然后取找到的位置i,j之中小的那个。/*Accepted 100K 16MS C++ 700B 2012-08-03 09:39:45*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>using namespace s 阅读全文
posted @ 2012-08-03 09:45 找回失去的 阅读(273) 评论(0) 推荐(0)
POJ 1007 DNA Sorting
摘要:按照字符串的逆序排序。/*Accepted 100K 16MS C++ 863B 2012-08-03 08:30:48*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>using namespace std;const int MAXN = 55, MAXM = 110;struct str{ char s[MAXN]; int r;}t[MAXM];int n, m;bool cmp(str a, str b){ return a.r < 阅读全文
posted @ 2012-08-03 08:38 找回失去的 阅读(154) 评论(0) 推荐(0)
POJ 2388 Who's in the Middle
摘要:排序后输出中位数,直接用algorithm的sort。/*Accepted 204K 32MS C++ 347B 2012-08-02 17:13:37*/#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int MAXN = 10010;int a[MAXN], n;int main(){ int i; while(scanf("%d", &n) == 1) { for(i = 0; i < n; i ++) .. 阅读全文
posted @ 2012-08-02 17:16 找回失去的 阅读(114) 评论(0) 推荐(0)
POJ 2299 Ultra-QuickSort
摘要:题意描述的是求冒泡排序过程中交换的次数。如果用冒泡排序统计次数的话会超时,因为有这么一条性质,排序交换的次数等于逆序数之和,所以转化成求逆序数之和。用归并排序。#include<stdio.h>#include<string.h>#include<stdlib.h>const int MAXN = 500050;int A[MAXN], T[MAXN], n;__int64 cnt;void MergeSort(int l, int r){ int p, q, i, m; if(r - l > 1) { m = l + r >> 1; p 阅读全文
posted @ 2012-08-02 17:07 找回失去的 阅读(159) 评论(0) 推荐(0)
POJ 3764 The xor-longest Path
摘要:建立字典树,树的结点记录根结点到该结点的连续异或值。由(a^c)^(b^c)==a^b可得任意两结点的异或值,等于两结点之间这条路的连续异或值。由此把每个结点的值插入01字典树,从二进制31位~0位,并查找,尽可能的向每一位的不同方向查找(这样异或这一位能得1),取最大值。位运算还得继续学习。/*Accepted 44068K 875MS C++ 1756B 2012-08-02 16:10:05*/#include<stdio.h>#include<string.h>#include<stdlib.h>const int MAXN = 210000;typ 阅读全文
posted @ 2012-08-02 16:26 找回失去的 阅读(514) 评论(0) 推荐(0)
POJ 3630 Phone List
摘要:和1056一样是判断前缀,唯一的区别就是这里是个10叉树。/*Accepted 2776K 110MS C++ 961B 2012-08-02 14:06:58*/#include<stdio.h>#include<string.h>#include<stdlib.h>typedef struct{ int next[10]; int alr, end;}Trie;Trie t[110000];int tp, n;int insert(char *x, int site){ if(t[site].end) return 1; ... 阅读全文
posted @ 2012-08-02 14:12 找回失去的 阅读(177) 评论(0) 推荐(0)
POJ 1056 IMMEDIATE DECODABILITY
摘要:判断编码是否合法。合法的编码不允许出现一个编码是另一个编码的前缀。问题就在判断是否出现这样的情况。用字典树存储,定义两个标记,end为0代表当前结点是一个编码的结束,alr为1代表有一个编码经过了这个结点。由字典树的性质,当一个编码结束的结点alr为1,那么代表这个编码是另一个编码的前缀。此外,当一个编码经过的某个结点出现end值为1的情况,说明有一个编码是当前编码的前缀。/*Accepted 168K 0MS C++ 1044B 2012-08-02 13:05:53*/#include<stdio.h>#include<string.h>#include<.. 阅读全文
posted @ 2012-08-02 13:16 找回失去的 阅读(1365) 评论(0) 推荐(0)
POJ 2513 Colored Sticks
摘要:字典树存储,用并查集判连通,欧拉回路判通路。/*Accepted 59208K 422MS C++ 1191B 2012-08-02 11:38:21*/#include<stdio.h>#include<string.h>#include<stdlib.h>typedef struct{ int next[26]; int cnt, ord;}Trie;Trie t[3000000];int tp, op;int p[510000];char s1[20], s2[20], odd;int find(int x){ return p[x] ==... 阅读全文
posted @ 2012-08-02 11:43 找回失去的 阅读(186) 评论(0) 推荐(0)
POJ 1521 Entropy
摘要:求哈夫曼树的平均码长,用优先队列来写,先记录某个字符在字符串里出现的次数,然后放入队列。依次取出第一小和第二小的数,将两个数相加,构成新的虚拟结点,放入队列中。/*Accepted 196K 0MS C++ 918B 2012-08-01 17:25:00*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<queue>using namespace std;int key[1 << 7], len;char t[1 << 10];int huffm 阅读全文
posted @ 2012-08-01 17:33 找回失去的 阅读(256) 评论(0) 推荐(0)
POJ 2752 Seek the Name, Seek the Fame
摘要:给出一个字符串A,求A有多少个前缀同时也是后缀,从小到大输出这些前缀的长度分析:KMP对于长度为len的字符串,由next的定义知:A[0]A[1]...A[next[len]-1]=A[len-next[len]]...A[len-1]此时A[0]A[1]...A[next[len]-1]为一个符合条件的前缀有A[0]A[1]....A[next[next[len]]-1]=A[len-next[next[len]-next[next[len]]]...A[next[len]-1],故A[0]A[1]....A[next[next[len]]-1]也是一个符合条件的前缀故从len=>n 阅读全文
posted @ 2012-08-01 16:55 找回失去的 阅读(203) 评论(0) 推荐(1)
POJ 2406 Power Strings
摘要:用KMP求循环节。/*Accepted 5288K 110MS G++ 712B 2012-08-01 16:03:19*/#include<stdio.h>#include<string.h>#include<stdlib.h>const int MAXN = 1 << 20;char t[MAXN];int next[MAXN], len;void Make_Next(){ int i = 0, j = -1; next[0] = -1; len = strlen(t); while(i < len) { if(-1... 阅读全文
posted @ 2012-08-01 16:10 找回失去的 阅读(204) 评论(0) 推荐(0)
POJ 3461 Oulipo
摘要:字符串模式匹配,KMP算法相当高效,O(n+m)。关键在求出模式串的next数组,求完这个,一些基本的题应该都是没有问题了的,文本串只要扫描一次。求模式串在文本中出现的次数,当匹配模式串的最后一个字符时,就说明出现了一次。/*Accepted 1192K 94MS C++ 987B 2012-08-01 09:21:25*/#include<stdio.h>#include<string.h>#include<stdlib.h>const int MAXT = 1000100;const int MAXW = 10010;char T[MAXT], W[MA 阅读全文
posted @ 2012-08-01 09:29 找回失去的 阅读(271) 评论(0) 推荐(0)
POJ 3080 Blue Jeans
摘要:这道题是字符串的简单题,主要是为了熟悉四个函数的用法:strcpy:字串复制 原型:char*strcpy(char*dest,char*src); 功能:把src所指由'\0'结束的字符串复制到dest所指的数组中。strncpy:字串复制原型:char*strncpy(char*dest,char*src,size_tn); 功能:将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样只有遇到NULL才停止复制,而是多了一个条件停止,就是说如果复制到第n个字符还未遇到NULL,也一样停止),返回指向dest的指针。函数名:strstr 函数原型:ex 阅读全文
posted @ 2012-07-31 11:43 找回失去的 阅读(157) 评论(0) 推荐(0)
POJ 1442 Black Box
摘要:大顶堆和小顶堆。/*Accepted 624K 157MS C++ 906B 2012-07-30 17:18:34*/#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<queue>using namespace std;const int MAXM = 30030;int n, m;int a[MAXM];int main(){ while(scanf("%d%d", &m, &n) == 2 阅读全文
posted @ 2012-07-30 17:24 找回失去的 阅读(186) 评论(0) 推荐(0)
POJ 1523 SPF
摘要:题意很容易弄懂,就是找到割点,以及割点连接的强连通分量的个数,简称连通数。用tarjan来求,假设1为根结点,则连通数为0。其他点假设连通数为1。根据下面的定义来求。if(low[pnt[i]] >= dfn[cur]) sub[cur] ++;【割点】在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合。当割点集合的顶点个数只有1个时,该顶点就是割点。此时,我们可以得到割点的定义如下:若有k的儿子为i,我们定义AnceDeep[i]为结点i辈分最高(深度最浅)的祖先的深度,deep[k]为k的搜索深度 阅读全文
posted @ 2012-07-30 15:59 找回失去的 阅读(274) 评论(0) 推荐(0)

上一页 1 2 3 4 5 6 下一页