摘要:求出单源的第二短路径。次短路径可以看作是k短路径问题的一种特殊情况,求k短路径有Yen算法等较为复杂的方法,对于次短路径,可以有更为简易的方法。下面介绍一种求两个顶点之间次短路径的解法。我们要对一个有向赋权图(无向图每条边可以看作两条相反的有向边)的顶点S到T之间求次短路径,首先应求出S的单源最短路径。遍历有向图,标记出可以在最短路径上的边,加入集合K。然后枚举删除集合K中每条边,求从S到T的最短路径,记录每次求出的路径长度值,其最小值就是次短路径的长度。在这里我们以为次短路径长度可以等于最短路径长度,如果想等,也可以看作是从S到T有不止一条最短路径。如果我们规定求从S到T大于最短路径长度的次
阅读全文
文章分类 - 图论
摘要:题目大意就是给出一串数,给出的约束是从第x到第x+y个数的和大于或者小小于val,问你这样的序列是否存在..差分约束都是某两个数的差,但是这道题是某一区段的和问题,怎么解决?转换一下,由于题目没有让求和,可以用一个数组s[n]表示前n项的和那么把n个点表示成前n项和来建图,至于大小关系需要转换,如果Ax+Ax+1+Ax+2+...Ax+y<K ==>S[x+y]-S[x-1]<K ==>S[x+y]-S[x-1]<=k-1.可以说明x-1到x+y之间有一条权值k-1的边,同理Ax+Ax+1+Ax+2+...Ax+y>K ==>S[x+y]-S[x-1]
阅读全文
摘要:有N(N<=10000)头牛,每头牛都想成为most poluler的牛,给出M(M<=50000)个关系,如(1,2)代表1欢迎2,关系可以传递,但是不可以相互,即1欢迎2不代表2欢迎1,但是如果2也欢迎3那么1也欢迎3.给出N,M和M个欢迎关系,求被所有牛都欢迎的牛的数量。用强联通分量做,求连通分量我用的是Kosaraju算法。首先求出联通分量的个数,然后依次求各个联通分量的出度,如果仅有一个连通分量出度为0则这个联通分量内的点的个数就是答案;如果有多于一个的联通分量的出度为0,则说明此有向图肯定不连通。因此直接输出0。可以用Tarjan算法或者kosaraju算法来求解,但是
阅读全文
摘要:给出一些成为恋爱对象的条件,再给出一些人的信息,问你最多能从中挑出多少个童鞋,没有恋爱关系?首先把信息读入后,循环一次建图,看谁有恋爱关系,然后求出二分匹配,由于恋爱是双向并且两个集合相同,所以找出的二分匹配必定是偶数并且匹配的线段中有A-B and B-A 的双向匹配,所以题目要求的是最大独立集合,所以答案就是节电个数n-最大匹配/2#include <queue>#include <stack>#include <math.h>#include <stdio.h>#include <stdlib.h>#include <io
阅读全文
摘要:给出几个景点,然后问你从家出发,不重复经过景点,并且全部游览完再回家么?就是求是否有汉密尔顿回路,在这里在复习下欧拉图还有汉密尔顿的几个概念,全面进入图论备战计划中图G的一个回路,若它恰通过G中每条边一次,则称该回路为欧拉(Euler)回路。 具有欧拉回路的图称为欧拉图(简称E图)。欧拉回路的判断 一下判断基于此图的基图连通。无向图存在欧拉回路条件 一个无向图存在欧拉回路,当且仅当该图所有顶点度数都是偶数。有向图存在欧拉回路条件 一个有向图存在欧拉回路,且所有顶点的入度等于出度混合图存在欧拉回路条件 要判断一个混合图G(V,E)(既有有向边又有无向欧拉回路的判断 一下判断基于此图的基图连通。无
阅读全文
摘要:三国志TimeLimit: 5000MS MemoryLimit: 32768 KbDescription 《三国志》是一款很经典的经营策略类游戏。我们的小白同学是这款游戏的忠实玩家。 现在他把游戏简化了一下,地图上只有他一方势力,现在他只有一个城池,而他周边有一些无人占有的空城,但是这些空城中有很着不同数量的同种财宝。我们的小白同学虎视眈眈的看着这些城池中的财宝。 按照游戏的规则,他只要指派一名武将攻占这座城池,里面的财宝就归他所有了。不过,一旦攻占领这座城池,我们的武将就要留守,不能撤回。因为我们的小白手下有无数的武将,所以他不在乎这些。 从小白的城池派出的武将,每走一公里的距离就要消耗一
阅读全文
摘要:给出两个点,后跟几个字母,一个字母表示一个公司,然后两个点表示此公司连接此俩点最后给出连个点,问你连接的公司有哪些?并且此图是有向图根据问题描述,应该是求全员最短路径问题,目前根据所学的只能用Floyd算法了吧,还有这次不是单纯的floy,否则超时,因此需要剪枝一下此外,floyd算法我一直忽视一个问题就是它竟然跟循环的顺序还有一定关系 for(i to n) for(j to n) for(k to n) if(map[j][i]&&map[i][k])map[j][k]=1 不知道有时候可以通过,有时候就失败,回头总结下原因,此题先上代码吧 1 #include <s
阅读全文
摘要:给出几个单词,问你是否能首位相接起来,按照字典的升序进行排序先根据入度出度判断是否能形成欧拉路,否则就不能形成然后再进行DFs搜索需要注意一点的是,在判断欧拉路找起始点的时候,有可能会形成欧拉回路,因此找到此时的最小的一个节点即可View Code 1 #define N 1005 2 #include<algorithm> 3 #include<iostream> 4 using namespace std; 5 int n; 6 int degree_in[30],degree_out[30],edge_order[1000]; 7 struct Edge 8 {
阅读全文
摘要:给出几个节点,以及期中他们的距离,要求求出走遍所有节点的最短路径下面转载一个结题报告,写得比较详细Tips:1. 先解释下"度"的概念, 对于无向图中某结点, 它和n条边相连, 就称它的度为n. (有向图还分出度入度, 这里简化了, 不管)2. 参考欧拉回路的概念, 无向图存在欧拉回路, 当前仅当所有点度数均为偶数. 证明比较简单, 因为走完一条回路, 对于所有点均进去一次, 出来一次. 故, 对于任意点的度数,都是成对的在"消耗".3. 题中所描述的回路, 有重复经过某边, 这没关系. 现在假设邮递员按题目要求走了一条最短的回路P.那么, 把P所有重复
阅读全文
摘要:问题给出两个城市之间的收费,然后让你求出所给的从一个城市到另外一个城市最小费用的最大值依旧prim和floyd算法,这里就只给出floyd,转移方程是:dis[i][k]=max(dis[i][k],min(dis[i][j],dis[j][k]));此题关键一点还是对于城市名字字符串的处理,先输入时候保存,最后还要查询 1 #include <stdio.h> 2 #include <string.h> 3 #define max(a,b) (a)>(b)?(a):(b) 4 #define min(a,b) (a)<(b)?(a):(b) 5 int c
阅读全文
摘要:给出几个坐标,要求从第一个坐标到第二个坐标的路径中最大跳跃距离的最小值求单源最短路径问题,首先想到用dj算法,不过稍有不同找到一个点后,更新其他点时候需要dis2[j][1]=MIN(dis2[j][1],MAX(dis2[temp][1],dis2[j][temp]));也就是如果j 通过temp到达1这个点时候距离比直接到1短,就有可能产生新的值,更新掉... 1 #include <stdio.h> 2 #include <memory.h> 3 #include <math.h> 4 #define MAX( x, y ) ( ((x) > (
阅读全文
摘要:给出几个点的坐标,然后期中有几个点可以用手机通信,手机不论距离,剩余的用电话通信,问你最少需要用线的情况下最大的线路长度是多少其实就是求出最小生成树以后,把最大的那几个点去掉用手机来通信,剩余的最大那个就是所有的prim的基本应用 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 #include <algorithm> 5 using namespace std; 6 struct point 7 { 8 double x; 9 double y;10 }alld[
阅读全文