![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
acm之路
文章平均质量分 73
sky1203850702
所有的好走的路都是下坡
展开
-
POJ1077(经典的八数码问题)
很经典的八数码问题,可以用单向广度优先搜索、双向广度优先搜索、A*算法、IDA算法解。用了双向广度优先搜索和A*算法解,在用A*算法时,纠结了好几天,后来在网上看了一份博客才发现自己错在哪。之后解出来了。虽然做这题时很纠结,不过收获真的很大,痛而快乐着…………下面贴出用双向广度优先搜索和A*算法做的代码 //A*算法#include #include #include原创 2012-08-05 11:00:49 · 3679 阅读 · 1 评论 -
POJ3039
分母从1到32767枚举,比较所得的新分式与分式的大小,再依次更新即可,注意是如何更新分子。。。 #include #include #include using namespace std;const int maxn=32767;int gcd(int a,int b){ int c; if(a==0) return b;原创 2012-08-11 17:18:17 · 585 阅读 · 0 评论 -
POJ1975—传递闭包问题
和POJ3660做法一样,一道水题。。。。。。#include #include using namespace std;const int maxn=102;bool t[maxn][maxn];int main(){ int i,j,k,tt,n,m,a,b; int ans,temp1,temp2; scanf("%d",&tt)原创 2012-08-12 15:23:31 · 946 阅读 · 0 评论 -
POJ3660—有向图的传递闭包问题
题目很简单,就是求有多少只奶牛的排名可以确定下来。因为每只奶牛的排名是固定的,共有n只奶牛,排在它之前和排在它之后的奶牛的总数是n-1,如果满足这个条件,则该奶牛的排名就可以确定下来。用类似于Floyd算法的传递闭包算法,如果a的排名先于b的排名,则生成一条由a指向b的有向边,然后再按照上面的思想就很容易解决了。#include #include using namespace std原创 2012-08-12 14:46:20 · 1324 阅读 · 0 评论 -
POJ2240
做法与POJ1860一样#include #include #include using namespace std;const int maxn=1000;int n,m;double sum[maxn]; //sum[i]表示当前货币在第i种货币下的价值struct Edge{ int s; int t; do原创 2012-08-12 20:31:14 · 631 阅读 · 0 评论 -
POJ1860—Bellman-Ford算法
这题和POJ2240是两道很经典的题目,这两道题目是求最大路径。本题是反向利用Bellman-Ford算法,求能无限松弛的最大路径,因此松弛操作的次数也不一定是n-1次(n是货币种类数),只要某一次松弛操作时,sum[s]的值能比输入的钱的数量大就可以,松弛操作的次数可能大于n-1次,也可能小于n-1次,在用Bellman-Ford算法求最短路径时,每次松弛可以设置一个标志,初值为false,如果原创 2012-08-12 17:35:55 · 497 阅读 · 0 评论 -
POJ3259—Bellman-Ford算法实现
题目的大意是有F个农场,每个农场有N个牧场,M条双向路径,W个虫洞,虫洞是单向的,可以实现时间旅行,返回到以前某个时间。问从某个牧场出发,经过若干路径和虫洞,能否在没有离开出发地时回到出发地,见到自己。其实就是一个用Bellman-Ford算法求负权环的问题,当图中存在负权环时,就能够在出发之前回到出发地,见着自己,将虫洞的权值加上负号,然后再用Bellman-Ford算法求解就可以了。多原创 2012-08-15 11:27:18 · 1001 阅读 · 0 评论 -
HDU4360—SPFA算法实现
比赛时做这题真纠结,也觉得可惜,马上就要学习SPFA算法了,可还没学时,就考了这个算法。用SPFA算法做这题,(本人也是第一次用SPFA算法解题,是看了别人的代码后自己再写的)。关键在于会将一个结点分为四个状态的结点,然后再利用Spfa算法解,并不会很难。由于代码上有注释,这里便不再细说了。#include #include #include #include using原创 2012-08-15 21:55:03 · 748 阅读 · 0 评论 -
HDU4364—十六进制矩阵运算
题意是给定一个状态矩阵,用该矩阵右乘一个已知的矩阵,该已知矩阵的元素是2或3或1,定义运算加法为按位异或,乘法有三种,当乘的数字是1时,不变,当乘的数字是2时,进行左移位运算,当乘的数字是3时,先进行左移位运算,然后与原来没进行移位操作的时候的这个数进行按位异或操作。每次移位操作后,如果所得的数字大于0xFF,则还要和0x1B进行按位异或操作。 要注意的一点就是进行完按位异或操作后,所得结果还可原创 2012-08-17 15:49:54 · 1792 阅读 · 0 评论 -
POJ1364—Bellman-Ford算法+差分约束系统
做简单转换,直接套用差分约束系统的模板即。注意点:和Si(i=0,1,2,...,n)映射为Vi+1,增设源结点0,所以共有n+2个结点,需进行n+1次的松弛操作,其他的很简单。#include #include #include #define inf 10000000using namespace std;const int maxn=102;int n,m,n原创 2012-08-17 21:51:27 · 682 阅读 · 0 评论 -
POJ1201—差分约束系统+SPFA实现
题目很简单,用差分约束系统解决。假设Si=Z与结合[1,i)的交集的元素的个数,则依题意有S[b+1]-S[a]>=c,还有隐含条件S[i+1]-S[i]>=0 && S[i]-S[i+1]>=-1。然后求最短路径或最长路径,用Bellman-Ford算法解会超时,于是用SPFA算法解,288ms,还算快。可以通过SPFA算法求最短路,也可以通过SPFA算法求最长路解这题,时间消耗上差不多一样原创 2012-08-19 11:24:09 · 488 阅读 · 0 评论 -
POJ3159—糖果分配 差分约束系统实现
和POJ1716、POJ1201一样,用差分约束系统解,此题是求最大值,所以求最短路,则需要增设一个源结点,因为是求1号结点和n号结点的最大差值,不妨就以1号结点为源节点进行求最短路径(差值越大越好,所以可以假设1号得到0,求n号的最小值就可以)。此外,此题如果用SPFA+队列会超时,用SPFA+栈可以通过,时间500ms,这可能与给的数据和队列的先进先出、栈的后进先出特点有关。#includ原创 2012-08-19 15:29:44 · 647 阅读 · 0 评论 -
POJ3268—Silver Cow Party
题目很简单,开始写时用的是Floyd算法,结果是TLE,后来改用两次Dijkstra算法,求开会地点到其余各点的距离和其余各点到开会地点的距离,同一个点的两个距离之和最大就是所要求的。 #include #include #include using namespace std;const int maxn=1002;const int inf=100000000;原创 2012-08-12 10:50:58 · 510 阅读 · 0 评论 -
POJ3072—Robot Dijkstra实现
简单的Dijkstra题目,稍微转个弯就可以了,因为要计算由一个点转到另一个点时所需的时间,所以可以设置一个结构体,用个成员变量记载该点到起点的距离,距离是起点到该点的直线距离加上上一个点转向该点的角度(一个角度需时一秒),然后再用Dijkstra求解就很简单了。#include #include #include #include using namespace std;原创 2012-08-12 09:01:07 · 519 阅读 · 0 评论 -
POJ1251(基础的最小代价生成树问题)
运用Kruskal算法+并查集,算是复习了一下并查集和求最小代价生成树的知识。#include #include #include #include using namespace std;int n,sum,num,bin[80];bool visit[30];struct node //所有的村庄从1开始标号{ int x;原创 2012-08-05 15:44:28 · 650 阅读 · 1 评论 -
POJ1251—最小生成树问题的Prim实现
很简单的求最小代价生成树的问题,利用Prim很容易求出 #include #include #include using namespace std;const int maxn=200; //最大费用是不多于100,所以定义一个比100 大的数即可int n,sum,weight[30][30];int lowcost[30];bool visit[原创 2012-08-05 17:07:10 · 376 阅读 · 0 评论 -
POJ1679 The Unique MST 解题报告
问题核心是如何求最小代价生成树,可以用Kruskal算法或者Prim算法求出,其中Kruskal算法的时间复杂度是O(mlogn),Prim算法的时间复杂度是O(n^2),所以建议使用Kruskal算法求解最小生成树的问题。此外是如何判别最小生成树是否唯一,方法如下:1、对图中的每一条边,检查是否有权值和它一样的其他边,如果有就标记这条边。2、求一次最小生成树,得到最小费用w1,留作比原创 2012-08-05 20:31:13 · 427 阅读 · 0 评论 -
POJ2349—最小生成树的Kruskal和Prim实现
刚开始做这题时,用的是Kruskal算法做的,做了很长时间没有做出来,后来发现是结构体里的距离len不能定义为double类型的(double类型的数据在计算时很不稳定),就改成Int类型的,改完后还是WA,看了很久后也没有找出来,无奈之下上网看了看别人的解题报告,核心算法还是一样,不同之处在于合并时出问题了。下面贴出用Kruskal和Prim算法AC了的,和用Kruskal算法WA的代码……原创 2012-08-06 16:55:42 · 565 阅读 · 0 评论 -
POJ3522—最小生成树的巧妙应用
题目大意是:给定一个带权无向图,求该图的所有生成树(并不是最小生成树)中的最小的最大权值与最小权值之差。解析:要求所有生成树中的最小的最大权值与最小权值之差,当然不能一个一个求出来进行比较,仔细分析就可以知道,只需将图的所有边按权值大小升序排序,依次枚举每一条边,以每一条边的权值为下限求最小生成树,因为生成最小生成树时,每次都是取可以取的权值最小的边来构成最小生成树,因而保证了以该边为权值下限原创 2012-08-06 20:47:18 · 651 阅读 · 0 评论 -
POJ3625—最小生成树+heap的实现
刚开始写时用的是一般的Kruskal算法,结果是超时,后来改为Kruskal+优先队列,结果是出错了,因为不太了解STL的知识,很难下手找出问题,所以上网找了别人的代码看了一下,然后学习了一下heap堆,就写出来了。发现STL真的好强大啊#include #include #include #include using namespace std;const int max原创 2012-08-08 14:42:27 · 458 阅读 · 0 评论 -
HDU4349—Lucas定理的应用
先简要介绍Lucas定理:A、B是非负的整数,p是质素,将A写成p进制数a[n]a[n-1]....a[0],将B写成p进制数b[n]b[n-1]...b[0],C(A,B)与C(a[n],b[n])*C(a[n-1],b[n-1])*C(a[n-2],b[-2])*....*C(a[0],b[0])模p同余。本题求奇数的个数,即要判断C(n,m)的奇偶性,:使用Lucas定理推导,我原创 2012-08-08 16:29:35 · 768 阅读 · 0 评论 -
POJ1062—婚姻买卖
求有限制的最短路,重点在于等级限制。处理的方法是:将一路径上的最大、最小等级记录下来,每次取最大最小等级差在允许的范围内的点加入。这只要申请几个数组就可以办到,很简单的。 #include #include #include #include using namespace std;const int maxn=102;const int inf=100000000;i原创 2012-08-09 10:25:29 · 809 阅读 · 0 评论 -
POJ3625—Prim实现
不多说,很简单,基础题。应该得出一个结论,Prim算法比较适合求稠密图的最小生成树,Kruskal算法比较适合求稀疏图的最小生成树.#include #include #include #include using namespace std;const int maxn=1002;const double maxm=2000000;bool visit[maxn]原创 2012-08-08 18:57:15 · 743 阅读 · 0 评论 -
POJ2253—Dijkstra算法的变体的应用
题目大意求青蛙由起点跳到终点的过程中,在所有的路径中的最大步伐中的最小步伐。题目简单。用Dijkstra算法解,但并非是求最小路径或最小路径长度。这里是Dijkstra算法的变体,结合贪心算法的思想,在走每一步时,选取距离最小(即步伐最小)的那一步走,每一次走都是在上一步的基础之上走的,用一个变量u记录每次通过的结点,再用一个变量记录已经走了的路径中的最大步伐,当u等于终点结点的编号时,就停止,输原创 2012-08-11 10:18:48 · 784 阅读 · 0 评论 -
POJ2387—水题+变态的题
这个题目很变态,数据范围题目给错了,是远大于100,而且还有重边,即两个顶点有多条边连接,当权值不一样,只要取最小的那个就可以了,注意这几点就很容易AC了。 #include #include #include using namespace std;const int maxn=1002;const int inf=100000000;bool visit[max原创 2012-08-11 14:07:16 · 785 阅读 · 0 评论 -
POJ1716—差分约束系统+Bellman-Ford算法 || SPFA算法的实现
题目看去有点难下手,如果学习了差分约束系统或是贪心算法会觉得很简单。刚开始时用Bellman-Ford算法解,采用的是求最短路径,由于Bellman-Ford算法复杂度本身就高,再加上增设了m+1条边,时间复杂度就更高了,所依超时了,后来改用求最大路径,不用增设源节点,这样就省时多了。提交后用时两百多毫秒,还算快。然后用SPFA算法再写了一遍,算是开拓思路,温习算法吧,用时32ms。#in原创 2012-08-19 09:09:31 · 596 阅读 · 0 评论