09 2012 档案

摘要:一、位运算符C语言提供了六种位运算符:& 按位与| 按位或^ 按位异或~ 取反> 右移1. 按位与运算 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。 按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 阅读全文
posted @ 2012-09-19 10:42 一生挚爱 阅读(163) 评论(0) 推荐(0)
摘要:状态压缩动态规划动态规划的状态有时候比较难,不容易表示出来,需要用一些编码技术,把状态压缩的用简单的方式表示出来。典型方式:当需要表示一个集合有哪些元素时,往往利用2进制用一个整数表示。*:一般有个数据 n 0){if(x & 1) num ++;x >>= 1;}return num;}*:然后就是DP部分了,明确好状态转移方程。先特殊处理第1行,然后按状态转移方程求出剩下的值。经典问题:TSP一个n个点的带权的有向图,求一条路径,使得这条路经过每个点恰好一次,并且路径上边的权值和最小(或者最大)。或者求一条具有这样性质的回路,这是经典的TSP问题。n dp[j][1] 阅读全文
posted @ 2012-09-19 09:39 一生挚爱 阅读(164) 评论(0) 推荐(0)
摘要:最近又复习了下最大流问题,每次看这部分的内容都会有新的收获。可以说最大流问题的资料网上一搜一大把,根本没有必要自己写;但是大部分资料上的专业术语太多了,初学很难理解,至少我当年学这部分的时候前几次就没有看懂。所以我准备备份一点个人的理解。图-1如图-1所示,在这个运输网络中,源点S和汇点T分别是1,7,各边的容量为C(u,v)。图中红色虚线所示就是一个可行流。标准图示法如图-2所示: 其中p(u,v) / c(u,v)分别表示该边的实际流量与最大容量。关于最大流熟悉了什么是网络流,最大流也就很好理解了。就是对于任意的u∈V-{s},使得p(s,u)的和达到最大。上面的运输网络中,最大流如图-3 阅读全文
posted @ 2012-09-17 16:13 一生挚爱 阅读(403) 评论(0) 推荐(0)
摘要:Ant TripTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 434 Accepted Submission(s): 179Problem DescriptionAnt Country consist of N towns.There are M roads connecting the towns.Ant Tony,together with his friends,wants to go through every part of .. 阅读全文
posted @ 2012-09-17 09:10 一生挚爱 阅读(116) 评论(0) 推荐(0)
摘要:伸展树(Splay Tree)是AVL树不错的替代,它有以下几个特点:(1)它是二叉查找树的改进,所以具有二叉查找树的有序性。(2)对伸展树的操作的平摊复杂度是O(log2n)。(3)伸展树的空间要求、编程难度非常低。提到伸展树,就不得不提到AVL树和Read-Black树,虽然这两种树能够保证各种操作在最坏情况下都为logN,但是两都实现都比较复杂。而在实际情况中,90%的访问发生在10%的数据上。因此,我们可以重构树的结构,使得被经常访问的节点朝树根的方向移动。尽管这会引入额外的操作,但是经常被访问的节点被移动到了靠近根的位置,因此,对于这部分节点,我们可以很快的访问。这样,就能使得平摊复 阅读全文
posted @ 2012-09-17 08:40 一生挚爱 阅读(142) 评论(0) 推荐(0)
摘要:#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;#define LL long long#define pii pair#define bug coutr) return ; int m=(r+l)>>1; newNode(x,m); makeTree(ch[... 阅读全文
posted @ 2012-09-15 22:10 一生挚爱 阅读(289) 评论(0) 推荐(0)
摘要:题目地址:http://poj.org/problem?id=2513题意就是给我们n个带颜色的木棍,看是否能排成一排(相接的颜色必须是一样的),解题思路是看的别人的:判断无向图中是否存在欧拉通路,判断条件是:1、有且只有两个度为奇数的节点2、图是连通的由于节点是字符串,因此我们可以利用字典树将其转换成一个颜色序号。这样,统计每种颜色的出现次数就可以了。判断图是否连通,可以利用并查集:若最后所有节点在同一个集合,则图是连通的。#include#include#include#define maxn 501000int father[maxn],degree[maxn];struct node{ 阅读全文
posted @ 2012-09-15 14:43 一生挚爱 阅读(154) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1247本题为简单字典树问题。解题思路:进行插入的时候,使用flg标记每个单词的结尾,当flg为true时表示到了某一个单词的结尾当为false时即不是某一个单词的结尾。进行查找的时候当一个单词的前一部分是某个单词的时候则判断后面一部分是否也是一个已经存在的单词,是则返回true否则返回false。#include#include#includechar list[50001][26];struct node{ bool flg; node *next[26];}*root;void insert(c 阅读全文
posted @ 2012-09-15 10:17 一生挚爱 阅读(105) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1251字典树模版题动态实现:#include#include#include#define maxn 26struct node{ int count; node *next[maxn];}*root;void insert(char str[]){ int i,len = strlen(str); node *current,*newset; current = root; for(i = 0; i next[k] != NULL) { current = current->next[k]; 阅读全文
posted @ 2012-09-15 08:16 一生挚爱 阅读(128) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1878欧拉回路:http://baike.baidu.com/view/566040.htm无向图存在欧拉回路充要条件: 一个无向图存在欧拉回路,当且仅当该图所有顶点度数都是偶数且该图是连通图有向图存在欧拉回路的充要条件: 一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图混合图存在欧拉回路充要条件: 要判断一个混合图G(V,E)(既有有向边又有无向边)是欧拉图,方法如下: 假设有一张图有向图G',在不论方向的情况下它与G同构。并且G'包含了G的所有有向边。那么如果存在一个 阅读全文
posted @ 2012-09-14 15:11 一生挚爱 阅读(186) 评论(0) 推荐(0)
摘要:本沙茶今年AHOI的时候,遇到裸的最佳匹配的题,竟然把KM算法搞忘了,幸亏是WJMZBMR神犇保佑,临时乱弄一通,想起来了……这MS反映出了本沙茶以前在看某些经典算法的时候看得不深,木有理解透彻……前几天又遇到一道最佳匹配的题,发现KM算法竟然又忘了……米办法,只有把这个搞死人的算法的具体过程重新看了一遍,终于懂了……【KM算法及其具体过程】(1)可行点标:每个点有一个标号,记lx[i]为X方点i的标号,ly[j]为Y方点j的标号。如果对于图中的任意边(i, j, W)都有lx[i]+ly[j]>=W,则这一组点标是可行的。特别地,对于lx[i]+ly[j]=W的边(i, j, W),称 阅读全文
posted @ 2012-09-10 21:02 一生挚爱 阅读(462) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1498/* 题意: 给你一个n*n的矩阵,在矩阵中分布着s种颜色的气球,给你k次扎破气球 的操作,每次操作可以扎破一行,或一列的同一颜色的气球。问在k次操 作后有那几种颜色的气球是不能被完全扎破的. 解题思路: 使用二部图最大匹配,寻找每种颜色的最大匹配数,(行,列分别为两个匹配) 如果都在m次内可以被刺破,则输出 -1 否则的话,按不能被刺破的气球 编号从小到大进行输出。*/#include#include#include#define maxn 101int map[max... 阅读全文
posted @ 2012-09-10 15:03 一生挚爱 阅读(151) 评论(0) 推荐(0)
摘要:【二分图】二分图是一种特殊的图结构,所有点分为两类,记做x和y,所有的边的两端分别在x和y,不存在两端同在x或y的边。【最大匹配、完备匹配】给定一个二分图(x,y),找到一种匹配数最大的方案,记做最大匹配。|x|=|y|=匹配数时,我们称该匹配方案为完备匹配。显然,解决了最大匹配也就解决了完备匹配。解决二分图的最大匹配可以用网络流或者匈牙利算法,两者本质上是相同的,不过不论从编程复杂度还是运行效率来讲,匈牙利算法都更加优秀。关于匈牙利算法,可以参见我以前写的文章:用匈牙利算法求二分图的最大匹配这里我主要叙述另一类问题:【最优完备匹配】对于二分图的每条边都有一个权(非负),要求一种完备匹配方案, 阅读全文
posted @ 2012-09-08 21:20 一生挚爱 阅读(489) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1054简单二分匹配,根据题意构造一个无向图。然后求最小点覆盖,然后扫描mark数组将曾经匹配的点所匹配的边消去。最小点覆盖 = 最大二分匹配#include#include#define maxn 1505struct node{ int v; node *next;}*head[maxn],edge[maxn*maxn],*p;int n,vis[maxn],mark[maxn];bool dfs(int v){ for(node *p = head[v]; p ; p = p->next) 阅读全文
posted @ 2012-09-08 20:30 一生挚爱 阅读(130) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1281本题为简单最小点覆盖。只需先求出最小点覆盖然后枚举所有的点。#include#include#define maxn 105bool map[maxn][maxn],vis[maxn];int n,m,k,mark[maxn],edge[maxn*maxn][2];bool dfs(int v){ for(int i = 1; i Hungarian()) sum ++; map[edge[i][0]][edge[i][1]] = true; } printf("Board %... 阅读全文
posted @ 2012-09-07 22:32 一生挚爱 阅读(98) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1151题目大意:考虑一个城市的街道都是单向的并且所有的道路都是从一个十字路口到另一个十字路口。从一个起点出发,沿着路走你永远都不可能回到起点,也就是说道路没有环。对于这样的一个假设,你的任务是编写一个程序,它可以找到让最小数量的伞兵,他们可以沿着路走经过所有的十字路口。而且一个十字路口不能被两个,或两个以上的人经过。每一个伞兵降落在一个十字路口,可以访问其他城镇街道后的十字路口。没有限制的起动交叉对于每个伞兵。解题思路:因为街道是有向的,而且不存在环,要到达所有的顶点我们可以转换为二分图的最小路径覆 阅读全文
posted @ 2012-09-07 21:36 一生挚爱 阅读(154) 评论(0) 推荐(0)
摘要:【基本概念】:二分图:二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。无向图G为二分图的充分必要条件是,G至少有两个顶点,且其所有回路的长度均为偶数。最大匹配:给定一个二分图G,在G的一个子图M中,M的边集中的任意两条边都不依附于同一个顶点,则称M是一个匹配. 选择这样的边数最大的子集称为图的最大匹配问题,如果一个匹配中,图中的每个顶点都和图中某条边相关联,则称此匹配为完全匹配,也称作完备匹. 阅读全文
posted @ 2012-09-07 20:33 一生挚爱 阅读(136) 评论(0) 推荐(0)
摘要://二分图的最小顶点覆盖数=最大匹配数//本题就是求最小顶点覆盖数的。#include#include#define maxn 105int n,m,k;bool map[maxn][maxn],mark1[maxn];int mark[maxn];bool dfs(int v){ for(int i = 1; i <= m; i++) { if(mark1[i] || !map[v][i]) continue; mark1[i] = true; if(!mark[i] || dfs(mark[i])) { mark[i] = v; return true; } } re... 阅读全文
posted @ 2012-09-07 16:55 一生挚爱 阅读(166) 评论(0) 推荐(0)
摘要:过山车Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5297 Accepted Submission(s): 2341Problem DescriptionRPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了。可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐。但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,Gras 阅读全文
posted @ 2012-09-07 16:07 一生挚爱 阅读(169) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3986题意:给出一个无向图,Harry Potter的目的是从1到n,而Voldemort为了阻止他,使用魔法毁掉了图中的一条边,问最坏情况下Harry要走的最短路是多少。注意:两点间可以能存在多条路,而且路是双向的,找到最短路后枚举边,求的最短路中最长的那条即为所求,#include#include#includeusing namespace std;const int maxn = 1005;const int INF = 1que;void spfa(bool flg){//求起点到终点的最 阅读全文
posted @ 2012-09-06 19:58 一生挚爱 阅读(145) 评论(0) 推荐(0)
摘要:题目地址:题解:题目意思为从起点到终点的最短路中有一条路不能通过了,求到从起点到终点的最短距离。可以先找出从起点到终点的最短距离,并将路径保存下来,然后枚举最短路径中的所有路径,求出从起点到终点的最短路径中最长的一条。#include#include#includeusing namespace std;const int maxn = 1005;const int INF = 200000000;struct node{ int v,t; struct node *next;}*head[maxn],edge[maxn*maxn];int n,m,dis[maxn],per[maxn];bo 阅读全文
posted @ 2012-09-06 15:40 一生挚爱 阅读(197) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3790最短路问题,因为结果会超int所以最终结果要用__int64位保存。当距离相等的时候,去费用小的路走。#include#includeusing namespace std;#define INF (1v = end; p->d = d; p->cost = cost; p->next = head[start]; head[start] = p++;}void spfa(int start){ int i; for(i = 1; i Q; Q.pus... 阅读全文
posted @ 2012-09-05 21:58 一生挚爱 阅读(115) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2544简单最短路问题#include#define INF 1 dis[i] + map[i][j]) dis[j] = dis[i] + map[i][j]; } } } for(i = 1; i dis[i] + map[i][j]) return false; } return true;}int main(){ int i,j,a,b,c; ... 阅读全文
posted @ 2012-09-05 21:54 一生挚爱 阅读(132) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1548本题为简单最短路,构图方法为如果在第i层可以上升Ki层则增加边i - >(i+Ki) 否则不加边,如果可以下降Ki层则增加边i-> (i - Ki)#include#include#includeusing namespace std;#define maxn 205#define INF (1que; que.push(start); while(!que.empty()) { int now = que.front(); vis[now] = true; que.pop(); 阅读全文
posted @ 2012-09-05 21:51 一生挚爱 阅读(167) 评论(0) 推荐(0)
摘要:首先,为了说话方便,列出一些术语:在启发式搜索中,对于每个状态 x,启发函数 f(x) 通常是这样的形式:f(x) = g(x) + h(x)其中 g(x) 是从初始状态走到 x 所花的代价;h(x) 是从 x 走到目标状态所需要的代价的估计值。相对于 h(x),还有一个概念叫 h*(x),表示从 x 走到目标状态所需要的实际最小代价(当然,这个值有时我们是事先无法知道的)。如果在你的启发函数里,能保证 h(x) x.v 就称作 Px 的偏离边(deviation edge); Px 上从 x.pre 到 t 的这一段子路径就称为 Px 的偏离路径(deviation path)。为什么叫作. 阅读全文
posted @ 2012-09-05 15:16 一生挚爱 阅读(487) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1869解题思路:本题为简单最短路,只需要求出两两间的距离,如果存在一个两两间距离大于7的点的话则输出No如果两两间的距离都小于或等于7则输出Yes#include#define INF (1 map[i][k] + map[k][j]) map[i][j] = map[i][k] + map[k][j];}int main(){ int i,j,a,b; while(scanf("%d%d",&n,&m)!= EOF) { for(i = 0; i 7) flg 阅读全文
posted @ 2012-09-05 11:14 一生挚爱 阅读(200) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3117解题思路:很显然费波纳数的后四位存在周期,通过测试可以发现后四位的周期为15000,所以后四位可以打表得出,前四位是参考了别人的思路才做出来的。因为费波纳数f[n] = 1/sqrt(5)(((1+sqrt(5))/2)^n+((1-sqrt(5))/2)^n).很显然当n非常大的时候(1-sqrt(5))/2)^n非常的小以至于可以忽略,假设F[n]可以表示成 t * 10^k(t是一个小数),那么对于F[n]取对数log10,答案就为log10 t + K,此时很明显log10 t#inc 阅读全文
posted @ 2012-09-05 10:24 一生挚爱 阅读(139) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2962方法一:使用spfa最短路算法,二分查找最大高度。运行结果:2962140MS612K1790 BC++#include#include#includeusing namespace std;#define INF (1Q; Q.push(start); while( !Q.empty() ) { int now = Q.front(); Q.pop(); vis[now] = false; for(node *p = head[now] ; p ; p = p->next) { ... 阅读全文
posted @ 2012-09-05 08:40 一生挚爱 阅读(159) 评论(0) 推荐(0)
摘要:一个人的旅行Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10311 Accepted Submission(s): 3500Problem Description虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯 阅读全文
posted @ 2012-09-04 08:24 一生挚爱 阅读(109) 评论(0) 推荐(0)
摘要:题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2680简单最短路问题。。。。。运行结果:Accepted2680265MS4164K1382 BC++//dijkstra#include#define INF (1 min + map[k][j]) dis[j] = min + map[k][j]; } }}int main(){ int i,j,start,end,cost,w; while(scanf("%d%d%d",&n,&m,&s) != EOF) { for(i = 0; i cost) m 阅读全文
posted @ 2012-09-03 16:34 一生挚爱 阅读(150) 评论(0) 推荐(0)
摘要:题目地址:http://poj.org/problem?id=1511方法一:/* 本题使用邻接表采用动态开辟的方式保存所有的边,首先定义一个保存指向的顶点和边所对应权值,*/#include#include#includeusing namespace std;#define NMAX_D 1000005#define NMAX 1000000001int n,m;//定义结构体struct node{ int v,cost; node *next;}edge[NMAX_D],redge[NMAX_D];//定义两个数组,edge用来保存顺向边,redge保存逆向边bool vis[NMAX 阅读全文
posted @ 2012-09-02 11:17 一生挚爱 阅读(125) 评论(0) 推荐(0)