图算法
文章平均质量分 78
zhumawinnner
这个作者很懒,什么都没留下…
展开
-
有向图的邻接表实现
图的邻接表表示法类似于树的孩子链表表示法。对于图G中的每个顶点vi,该方法把所有邻接于vi的顶点vj链成一个带头结点的单链表,这个单链表就称为顶点vi的邻接表(Adjacency List)。1. 邻接表的结点结构(1)表结点结构 ┌────┬───┐ │adjvex │next │ └────┴───┘ 邻接表中每个表结点均有两转载 2015-01-30 20:13:29 · 1543 阅读 · 0 评论 -
BFS—POJ3126-Prime Path
大致题意:给定两个四位素数a b,要求把a变换到b变换的过程要保证 每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数 与 前一步得到的素数 只能有一个位不同,而且每步得到的素数都不能重复。 求从a到b最少需要的变换次数。无法变换则输出Impossible 解题思路:超级水题,40入口的BFS + 素数判定不过剪枝之后就没有40入口了,入口数转载 2015-04-09 17:06:33 · 426 阅读 · 0 评论 -
DFS—poj2488
先上代码poj2488#include #include #include #include using namespace std;#define maxn 26struct Point{ int x, y;} way[maxn * maxn];bool map[maxn][maxn];int p, q;bool found;int dir[8][2]原创 2015-04-10 21:21:51 · 446 阅读 · 0 评论 -
DFS&模拟—POJ3009-Curling 2.0 if的用法区别
解题逻辑:/*DFS+回溯+剪枝*///Memory Time //188K 329MS #includeusing namespace std;const int inf=11;typedef class{ public: int r,c; //冰壶当前位置 bool status; //status冰壶当前状态:运动true ,静转载 2015-04-12 16:24:34 · 507 阅读 · 0 评论 -
DFS—POJ3083-Children of the Candy Corn
题目POJ3083大意:给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走先输出左转优先时,从S到E的步数再输出右转优先时,从S到E的步数最后输出S到E的最短步数 W为宽,列数H为高,行数 解题思路:DFS和BFS的综合题,但是写代码时要注意几方面: 1、 左转、右转优先搜索时必须标记当前位置转载 2015-04-12 09:54:35 · 895 阅读 · 0 评论 -
拓扑排序POJ1094
题目:POJ1094大意:对于N个大写字母,给定它们的一些偏序关系,要求判断出经过多少个偏序关系之后可以确定它们的排序或者存在冲突(有环存在,如A利用拓扑排序即可解决这个问题,但由于题目要求的是经过多少个关系之后就可以确定答案,因此每读入一个关系,就要进行一次拓扑排序。如果某一次拓扑排序之后可以确定它们的唯一排序或者发现冲突存在,则后面的直接略过。如果读入所有关系之后依然无法确定唯转载 2015-04-01 10:48:37 · 561 阅读 · 0 评论 -
图的邻接表的数组实现及其应用
一、基础对于有向图来说,我们把每条边的起始点(from)称为尾节点,终止点称为头结点。我们可以把每条边按如下定义:typedef struct{ int to; int w; int next;}Edge; Edge e[MAX]; //MAX为边的数量。e为结构体数组,用于存储边的信息int pre[MAX];原创 2015-02-04 10:06:54 · 858 阅读 · 0 评论 -
图算法总结
图算法大体无非两种,广度优先搜索和深度优先搜索。BFS的应用包括求最短路径,如Dijkstra算法;求最小生成树,如prim和kruskul算法。它们最大的目标就是求得一颗最小树,或最短路径,或最小生成,总之都是树。树,最大的特征就是无环。广度优先搜索BFS:Dijkstra算法和catch the cow有异曲同工之妙,前者是凡是选过的点(每轮的dist最小的)的dist值就原创 2015-03-29 10:48:38 · 483 阅读 · 0 评论 -
BFS_catch the cow
实质就是遍历所有可能的点(踩点),点入队,先入先出,形成一棵枝繁叶茂的树,谁先到达目的点,谁就胜利,输出此条路径累计的时间数。所以要记录每一次踩点的累计值step.另外,一定要注意的是,已入队的点千万不要重复入队,因为这毫无意义(会重复进行此点此前的操作)代码如下:解法一:#include #include #include #include #include #d转载 2015-03-29 00:27:54 · 460 阅读 · 0 评论 -
Prim算法和Kruskal算法
2.代码如下(与 Dijkstra算法的差别非常非常小)void DijkstraPath(MGraph g,int *dist,int *path,int v0) //v0表示源顶点 { int i,j,k; bool *visited=(bool *)malloc(siz原创 2015-01-10 16:58:54 · 561 阅读 · 0 评论 -
Bellman-Ford算法—求解带负权边的最短路径
1.Dijkstra不能得到含有负权边图(这里就不是环路了)的单源最短路径Dijkstra由于是贪心的,每次都找一个距源点最近的点(dmin),然后将该距离定为这个点到源点的最短路径(d[i]比如上图:1—>2权值为5,1—>3权值为6,3—>2权值为-2,求1到2的最短路径时,Dijkstra就会贪心的选择权为5的1—>2,但实际上1—>3—>2才是最优的结果,这样Dijks原创 2015-03-25 19:19:07 · 3374 阅读 · 0 评论 -
Floyd算法(所有点对最短路径)
Floyd算法(所有点对最短路径)就是每对可以联通的顶点之间总存在一个借助于其他顶点作为媒介而达到路径最短的最短路径值(这个值通过不断增添的媒介顶点而得到更新,也可能不更新——通过媒介的路径并不比其原路径更短),所有的值存储于邻接矩阵中。典型的动归思想。值得注意的是,Floyd算法本次的状态的获取只用到了上个阶段的状态,而没有用到其他阶段的状态,这就为压缩空间奠定了条件。Floyd原创 2015-03-25 22:05:07 · 2222 阅读 · 0 评论 -
Dijkstra算法(单源最短路径)
预备知识:邻接矩阵:表示图的一种方法,是一个二维数组。用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边)的数据,这个二维数组称为邻接矩阵。对于每条边(u , v),我们置A[u][v]=1;否则,置为0.如果边有一个权,我们可以置A[u][v]等于该权,而使用一个很大或者很小的权作为标记表示不存在的边。注意,无向图的邻接矩阵一定是对称的,而有向图的邻接矩阵不一定对称(一原创 2015-01-07 12:35:18 · 643 阅读 · 0 评论 -
有向无环图的动态规划实现
Dijkstra算法的本质是贪心技术,适用于所有的有环与无环图。有向无环图,简称DAG。如果一个图是无环的,可以考虑用动态规划。具体参见:http://www.cnblogs.com/lpshou/archive/2012/04/17/2453370.html 点击打开链接代码实现:#include#include#define x 9999#define max 9999转载 2015-01-27 16:39:43 · 735 阅读 · 0 评论 -
BFS—POJ3414-Pots
较原文有两处改动:1)以二维数组代替map,更简洁有效 2)输出操作过程,改进后更容易理解(原文好像也是对的,但是说不通)原文地址POJ3414-Pots#include#include#includeusing namespace std;int v1,v2; //两个瓶子的容量int c; //目标残余水量bool vist[101][101];in原创 2015-04-09 23:39:25 · 376 阅读 · 0 评论