- 博客(26)
- 收藏
- 关注
原创 POJ2528,线段树+离散化
题目链接:POJ2528Mayor's postersTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 50574 Accepted: 14658DescriptionThe citizens of Bytetown, AB, could not
2015-08-19 14:57:16 433
原创 POJ3468,A Simple Problem with Integers,线段树
题目链接:POJ3468A Simple Problem with IntegersTime Limit: 5000MS Memory Limit: 131072KTotal Submissions: 77541 Accepted: 23874Case Time Limit: 2000MSDescrip
2015-08-15 12:32:53 433
原创 POJ2342 Anniversary party 树形dp入门题
题目链接Anniversary partyTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 5234 Accepted: 2975DescriptionThere is going to be a party to celebrate the 80-
2015-08-14 11:02:54 449
原创 POJ2236,Wireless Network,并查集
题意就不解释了;这道题目怎么用并查集做呢?举个例子,若a,b之间的距离小于d,说明a,b可以通信,用并查集把它们俩连在一起,这时候,倘若,a,c之间的距离也小于d,a,c之间就可以通信,那么b,c也可以通信,用并查集把a,c连在一起,此时,a,b,c连在一棵树上,表明了它们之间互相可以通信(直接或间接);同理,不在同一棵树上的点不能实现通信;下面这段话写给自己看的 = = :刚
2015-08-02 10:38:02 388
原创 FZU1096,QS Network
题解:把网络适配器的价格加的网络电缆的价格中,再对新的价格图跑一遍prim就行了#include#include#include#include#includeusing namespace std;int t,n;int maz[1009][1009];int price[1009];bool vis[1009];int dis[1009];void prim()
2015-07-28 14:27:36 343
原创 POJ2349,ZOJ1914,Arctic Network
题意就不解释了,需要注意的是,每个卫星频道对应的是一个点,不是一条边!首先跑完prim之后,会得到一个数组d,里面保存的是最小生成树的每条边然后有s个卫星频道,那么就有s-1条边,所以直接在d数组里取第s条边就行了(之前得将d数组从大到小排下序)#include#include#include#include#include#include#includeusing na
2015-07-28 10:09:38 360
原创 Gym100187E,Two Labyrinths,广搜
题意:给你两幅图,判断一下两幅图是否有公共的最短路径,从左上角走到右下角,有的话输出YES,否则输出NO思路:首先把两幅图合在一起搜一遍,看是否有公共的路径走到右下角(右下角不一定可达),有的话,记下步数,没有的话,直接输出NO;然后,搜一遍第一幅图,记下到达右下角的最短步数(如果不可达,第一步之后就结束了);再搜一遍第二幅图,记下到达右下角的最短步数;最后比较这三个步数是否相
2015-07-28 08:48:50 417
原创 Gym100187A
水题,不过我题目意思没看懂= =,我以为每瓶药水只能用一次,这样的话,第二组样例硬是看不懂= =最后没做出来题目解法:1)如果n=1,那么就不需要用兔子来测试,输出0;2)然后在n瓶药水中,把长生不老药减去,如果此时n小于k,说明无法判别出;否则:n能整除k,则结果即为n/k否则n/k + 1#include#include#includeusing namespace
2015-07-27 20:45:31 586
原创 POJ2031,Building a Space Station,最小生成树模版题
这道题其实就是最小生成树模版题,关键是要把题意读懂解释一下题意(看题不用被题面所吓到,题目长不一定难!而且慢慢翻译文章也是一种乐趣!空间里有很多球型的单位,它们的半径不一定都是一样的,要让它们都连通,(两个单位连通有三种情况:1)它们彼此挨着或者重叠;2)它们之间用一个通道直接连通(通道是连在球的表面);3)它们通过某个单位间接连通),然后是,它们是空间中的单位,如果A-B通过通道连通,C
2015-07-27 09:58:32 516
原创 INT_MAX,INT_MIN,isdigit函数
1、头文件 #includeINT_MAX = 2147483647INT_MIN = -21474836482、头文件 #includeisdigit(char c)函数,传入参数为一字符,若参数为数字字符,则返回1,否则返回0
2015-07-26 15:58:05 443
原创 FZU2150,暴力广搜
题意就不解释了。这道题目的话,如果用技巧的话,感觉有点难度,因为初始两点的选取不知道怎样选才能得到最短时间;但是发现数据范围很小,这样的话,就可以暴力出所有的两点组合,在满足题意的情况下,选取最小的烧草时间即可。#include#include#include#include#include#includeusing namespace std;const int N =
2015-07-25 11:26:39 407
原创 HDU1495,广搜
其实这是一道比较常规的搜索题,思路也很符合搜索的想法(搜索其实就是暴力出所有结果,然后选取满足条件的结果);我感觉这题就难在写代码上;好了,先说思路吧:首先对于这三个容器(s->可乐瓶,a->杯子1,b->杯子2),只有以下几种情况:s往a里到可乐,s往b里倒可乐,a往s里倒可乐,a往b里倒可乐,b往s里倒可乐,b往a里倒可乐。所以直接暴力BFS就行了(代码详解)#include#inc
2015-07-24 11:34:12 467
原创 POJ1321,深度优先搜索
这道题目呢,思路是比较清晰的,首先肯定得用深搜,用两个标记数组,一个用来标记某一行是否已走,另一个用来标记某一列是否已走,然后在满足条件的情况下,搜出最多的可行方案。然而呢,我这个菜狗,竟然没把代码写好,改了好半天,还是WA,好弱啊。。。(这段话,大家可以不用看了= =,刚开始的代码bug出现在哪呢,4 4...#..#..#..#...把满足条件的(0,3),(1,2),
2015-07-23 14:16:02 551
原创 HDU2612,简单广搜题
这道题目真心蛋疼= =,看完题目,立马用双向广搜写了一发,交上去之后超时= =;后来想想,换个角度,枚举每个@,然后取最小总时间,尼玛还超时,代码实在改不动了,就去看了题解。然而呢,我觉得题解写的有问题。。。。呵呵吧,贴上题解+我认为的bug之处#include#include#include#include#includeusing namespace std;struct no
2015-07-22 20:18:59 748
原创 HDU1026,广搜输出路径题
#include#include#include#includeusing namespace std;#define INF 9999999struct node{ char data;//保存点的内容 int time; int x,y;//记录这点的位置,用于提供之前点的坐标 int prex,prey;//保存用最短时间到这个点的点的坐标
2015-07-20 15:44:07 474
原创 ACM_Kruskal算法
克鲁斯卡尔算法证明:从边出发,从所有的边当中选一条最小的边(如果最小的边不止一条,则任选一条即可)然后判断这条边的两个端点是否在同一棵树中(并查集判断),如果已经在同一棵树中,则舍去这条边,因为在这之前已经有一条比这条还短的边连接这两个节点了,如果不在,则把这两个节点连到一棵树中,并且记录下这条边,以此类推,直到边数达到n-1,此时n个点已经在同一棵树中了,算法结束。克鲁斯卡尔算法的时间复杂度为O(eloge)(e为网中边的数目)【怎么算出来的,百度一下吧= =】
2015-07-20 15:40:00 925
原创 ACM_Prim算法
普里姆算法证明:以任意一个顶点作为树的根(这里以1作为根)更新lowcase数组,找到里面最小值,并且这条边一定是最小生成树里面的边(最小生成树要包括所有的顶点,而想要包括这个顶点,只有这几条边,所以一定选择最小的边连接这个顶点)然后以这条边连接的另一个顶点更新lowcase数组,并把该顶点标记为已在树里面,再把已经在树里的点看成一个整体,再找此时lowcase数组里的的最小值,以此类推,直到所有
2015-07-20 15:38:41 1142
原创 ACM_SPFA算法
SPFA算法:首先源点到源点的距离为0,然后用源点对其他点进行松弛操作(更新操作),若松弛成功,表明源点到其的路径变小了,那么该点有可能能作为中间点松弛其他点,所以得将其入队列(如果它不在队列里面的话)某个点得到了松弛,如果它在队列里面,那么它能松弛的点会在接下的过程中得到松弛,如果它在这之前已经松弛了其他点,那么由于它受到了松弛,则那些它可以松弛的点将会进一步被松弛,所以它得重新入队列;如果没有
2015-07-20 15:34:09 957
原创 ACM_Bellman-ford算法
Bellman_ford算法:也是求单源最短路径,它与Dijkstra算法的区别是,它可以检查是否有负权值边的存在;如果有负权值边的话,是不存在最短路径的,因为一个数+负数,一定会更小,所以dis数组会不断更新;#include#includeusing namespace std;#define INF 9999999struct node{ int u,v,w;};//
2015-07-20 15:31:22 374
原创 ACM_Floyd-Warshall (Floyd) 算法
Floyd算法相当于Dijkstra算法的扩展版,由原来的一维数组到现在的二维数组,所以Floyd算法可以求得任何一个点到其他所有点的最短路径;for循环中k,i,j的顺序是不能改变的:k是中间点,每一个中间点都有可能能够更新任意两点之间的距离,所以,最外层for循环每轮到一个k值都得把整个二维数组跑一遍,能用k更新的就更新!#include#includeusing namespac
2015-07-20 15:29:06 336
原创 ACM_Dijkstra算法
Dijkstra算法(单源最短路算法):计算某一个节点到其他所有节点的最短路径;特点:以起始点为中心向外层层扩展,直到把所有的点都扩展到(因为要把所有的点都扩展到,所以效率比较低)证明:(先证明最短路径的最优子结构:i->k->j,如果i到j是最短路径,那么i->k也是最短路径,用反证法证明就OK)先在起始点可达的点里面选出一条最小边,可知,这条边就是起始点到该节点的最短路径(
2015-07-20 15:17:52 581
原创 ACM_邻接表
邻接表相连节点是插入链接的,不是顺序链接的(画图理解下面的代码,就能理解这句话的意思了)指针存无向图#include#include#includeusing namespace std;#define Max 100struct edge{ int v; struct edge *next;};//边结构,i j 之间有边,v存的值就是i或者j(无向图)
2015-07-20 14:59:14 574
原创 ACM_并查集
int find(int x)//递归+压缩路径{ return p[x] == x ? x : p[x] = find(p[x]);}int find(int x)// 朴素代码(没有压缩路径){ int y = x; while (ch[y] != y) y = ch[y]; return y;}int find(int x)//
2015-07-20 14:55:39 312
原创 ACM_快速排序算法
每次以数组第一个数为基数,从数组两端往中间找,小于基数的数放在数组的左边,大于它的数放在数组的右边,当i == j的时候,查找结束,将基数赋值到这个位置,这个数在数组中的位置就是这个,确定了。然后从这个数的左边和右边开始递归,直到所有的数都排完序。时间复杂度:nlog2n(最好,平均)、n2(最坏)#include#includeusing namespace std;void sort
2015-07-20 14:53:21 569
原创 ACM_归并排序算法
将数组中的数不断的递归,直到只剩一个数为止(因为一个数自然是有序的),然后再回溯排序(并),另外再用一个数组T存储当前排好序的数,然后再赋值给原数组A,直到所有的数都排好了序。时间复杂度:nlog2n(最好,最坏,平均)#include#includeusing namespace std;void merge_sort(int *A,int x,int y,int *T) //A是
2015-07-20 14:49:28 512
原创 POJ1915 双向广度优先搜索
双向广度优先搜索算法:初始状态(正向搜索)和目标状态(逆向搜索)同时向中间搜,当两个方向的搜索生成同一子状态时,搜索结束;一般用来解决最小等最优问题;如何判断是否生成了同一子状态:(1)用标记数组,若某一状态未被遍历到,则为0,正向遍历到为1,逆向遍历到为2,当遍历到某一状态时,判断一下其对应标记数组的值;(2)本题(poj1915)代码;#include#include#include;
2015-07-20 14:13:25 1220
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人