随笔分类 -  图论——最短路径&&差分约束

摘要:http://poj.org/problem?id=1734题意:给定一张图,n个点m条无向边(存在重边)。求该图的最小环(边权和最小) 注意此环满足展开的路径v1,v2,v3...v1中出了v1之外其他的点都必须不同,业绩不会存在1 2 3 3 2 1这样的环思路:1:朴素的求最小环的方法做E遍Dijkstra,枚举每条边e(i,j),删去边e(i,j)之后,求i到j的最短路经,然后再加上该边求最小值便得到的了最小环,时间复杂度为O(E*(N^2))。2:改进的floyd算法,求出任意两点之间的最短路的同时,求出最小环。这里是讲解求最下环的过程:先说一下Floyd算法和用Floyd算法求最小 阅读全文
posted @ 2013-01-26 10:09 E_star 阅读(314) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=2449题意:给出图,给出起点与终点以及k求第k短路。模板:#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include <set>#include <map>#include <str 阅读全文
posted @ 2013-01-22 21:04 E_star 阅读(215) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=3255题意:给你一张图,起点为1,终点为n 。求从1到n的次短路。(这里每条边可以重复走)思路:两遍最短路算法分别求出1到所有点的最短距离,n到所有点的最短距离。然后枚举每一条边找出第二短路。#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <cmath>#include <queue>#include &l 阅读全文
posted @ 2013-01-22 16:29 E_star 阅读(411) 评论(0) 推荐(0) 编辑
摘要:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2498题意:汉语...思路:比赛的时候是按spfa正向的处理的,然后记录每一点的前一个点如果出现相等去最小的那个。结果wa。赛后才知道这样处理时错的。比如下图:如果现在终点是6,现在2和3都能使6的距离达到最大且值相同。我们处理的时候会选2,但还是2这条路径却不是最优的,反而3是最有的。所以我们逆向见图,求一个最短路然后倒着输出就好了。#include <iostream>#include <cstdio>#includ 阅读全文
posted @ 2012-12-03 18:38 E_star 阅读(344) 评论(2) 推荐(0) 编辑
摘要:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2493题意:给定一个图,给出起点s,终点e 求从起点到终点的最短距离。这里我们允许从其中任意选择一条路径长度减半(这样的处理只能针对一条边)。思路:才开始思路是先求出最短路径,然后取最短路径上的路径的最大权值取一半。结果wa致死。。。后来思考才知道思路错了。这样不能保证最有,可能由起点到终点的一条不在最短路上的路径直接取半就是最优的。正确的处理方法是:两遍最短路,分别求出S到所有点的最短路,E到所有点的最短路。然后枚举每条边取半的情况取最小值即 阅读全文
posted @ 2012-12-03 18:01 E_star 阅读(317) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=1275题意:http://972169909-qq-com.iteye.com/blog/1185527这个解题报告描述的相当详细了。就不多说了;差分约束关键是找出约束条件,然后建图。最后就是套spfa或者bellman_ford的模板就是了;#include <iostream>#include <cstring>#include <cstdio>#include <queue>#define maxn 25using namespace std;struct node{ int v,w; 阅读全文
posted @ 2012-06-24 16:36 E_star 阅读(226) 评论(0) 推荐(0) 编辑
摘要:题意是:fy作为班长,分发糖果给每个孩子,而分发的过程要满足一个约束条件就是 B - A <= C 表示B所得到的糖果不能比A多c个。问fy(n点代表)所能得到的糖果数量与sp(0点代表)所能得到的糖果数目的最大差值。 很明显的差分约束题目根据B - A <= C建立约束图,求最短路得到最大值。不过这里ka queue的实现。用stack来实现才能ac。。。#include <cstdio>#include <cstring>#include <iostream>#define maxn 30007#define maxm 150004using 阅读全文
posted @ 2012-06-23 16:39 E_star 阅读(152) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=2983题意:给定两种约束关系Precise tip is in the form ofP A B X, means defense stationAisXlight-years north of defense stationB.Vague tip is in the form ofV A B, means defense stationAis in the north of defense stationB, at least 1 light-year, but the precise distance is unknown.d[i]表示 阅读全文
posted @ 2012-06-23 11:20 E_star 阅读(188) 评论(0) 推荐(0) 编辑
摘要:一个很好的差分约束总结:http://972169909-qq-com.iteye.com/blog/1185527第一:感觉难点在于建图第二:①:对于差分不等式,a - b <= c ,建一条 b 到 a 的权值为 c 的边,求的是最短路,得到的是最大值②:对于不等式 a - b >= c ,建一条 b 到 a 的权值为 c 的边,求的是最长路,得到的是最小值③:存在负环的话是无解④:求不出最短路(dist[ ]没有得到更新)的话是任意解第三:一种建图方法:设x[i]是第i位置(或时刻)的值(跟所求值的属性一样),那么把x[i]看成数列,前n项和为s[n],则x[i] = s[i 阅读全文
posted @ 2012-06-09 10:17 E_star 阅读(273) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=3662开始读这个题目的直接理解错了题意,没想到lengths竟然还有几段的意思;题意求从1到n的每段路径下(除去k各最大的)最长最短问题。一个无向图有n个点, m条边, 每边有花费val[i], 可以任意指定有k条边免费, 现要求选择若干条边构成顶点1到顶点n的一条路径, 使得路径上边权最大值(不包括免费边)最小.二分答案, 重新建图, Dijkstra感觉这个讲解比较详细:我们暂且不考虑最优解的问题, 假设A为一个可行解. 可以知道如果A成立, 则B(B>=A)一定成立. 这说明解具有单调性, 即所有可行解是一个单调序列. 我们模仿 阅读全文
posted @ 2012-05-06 15:40 E_star 阅读(288) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=3660才开始看到题目给我的第一印象就是拓扑排序,自己yy了一下不对。考虑到如果第i个奶牛的位置确定的话就必须知道他与其他n-1个奶牛的对应关系,所以A->B->C这样A也一定能够打败C所以要有A->C连一条线。用floyd将需要连接的边链接,然后统计每个点的度数只要>=n - 1即可,最后统计个数。这道题目和hdu 的这道题目floyd的灵活运用有异曲同工之妙:http://acm.hdu.edu.cn/showproblem.php?pid=4034View Code #include <iostream&g 阅读全文
posted @ 2012-05-06 10:35 E_star 阅读(242) 评论(2) 推荐(0) 编辑
摘要:http://poj.org/problem?id=2240刚开始看到题目时,看到数据量很小,就想到了搜索,搜索所有的环然后将边的权值相乘看是否大存在于1.0的环。。结果果断的TLE无语。。。最后看了看Discuss floyd1AView Code #include <iostream>#include <cstring>#include <cstdio>#include <cmath>#define maxn 34#define eps 1e-8using namespace std;char str[maxn][maxn];double m 阅读全文
posted @ 2012-03-09 19:34 E_star 阅读(204) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=1125刚开始以为是求最小生成树,可是打完代码一看结果根本不对。最后看了一下discuss原来是的那个一个点和m个点连接时,可以同时传送信息。所以只要转换成dijkstra求原点到所有点的最短然后找出最大时间,就是从原点到最后一个点的时间长度了,,循环遍历所有点当做原点情况,然后找出最佳值。。View Code #include <iostream>#include <cstring>#include <cstdio>#include <cmath>#define maxn 107using n 阅读全文
posted @ 2012-03-08 21:29 E_star 阅读(209) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=2253这道题的提议就是就最小生成树中的最大权所以我用了最小生成树prim算法View Code #include <iostream>#include <cstring>#include <cstdio>#include <cmath>#define maxn 207using namespace std;const double inf = 99999999.0;bool vt[maxn];double dis[maxn],map[maxn][maxn];struct node{ doubl 阅读全文
posted @ 2012-03-08 00:09 E_star 阅读(241) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=1062这道题太让我纠结了。。才开始把提议理解错了,就是那个等级问题,我以为只要交易的双方的等级差异<=m就可以呢。结果样例过了无限的wa最后搜了一下解题报告才看懂个那个等级问题。他是交易的所有人的等级差异都要<=m才是满足条件的。。。唉。。枚举所有可能参与交易的对象+Dijkstra求最短路就可以了。。。可是在这里我就卡死了。。。有个问题使我不解也讨论了很久还是没发现。。代码中见。。求解View Code #include <iostream>#include <cstring>#include < 阅读全文
posted @ 2012-03-07 22:00 E_star 阅读(282) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=3259第一周的题,已经是第二周末了。。还没做完。。唉。。效率啊。。。就是一个简单的判断有无负权值的环。bellmen_ford做法View Code #include <iostream>#include <cstdio>#include <cstring>#define maxn 5240#define inf 0x7fffffffusing namespace std;struct node{ int u,v; int w;}g[maxn];int n,m,w;int dis[maxn];bool b 阅读全文
posted @ 2012-03-04 13:29 E_star 阅读(191) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=186题意就是转化成求最短路的模型,不过这里是求最长应该。以前做最短路基本上都是用Dijkstra()对于其他几个算法没有弄的明白,所以做起来比较吃力。。。简介:SPFA(Shortest Path Faster Algorithm)是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算。算法大致流程是用一个队列来进行维护。 初始时将源加入队列。 每次从队列中取出一个元素,并对所有与他相邻的点进行松弛,若某个相邻的点松弛成功,则将其入队。 直到队列为空时算法结束。它可以在O(kE)的时间复杂度内求出源点到其他所有点的最短路径,可 阅读全文
posted @ 2012-03-03 11:25 E_star 阅读(314) 评论(2) 推荐(0) 编辑

点击右上角即可分享
微信分享提示