图论无权路径算法实现
2016-12-07 11:26
302 查看
查看原文:http://www.wyblog.cn/2016/12/07/%e5%9b%be%e8%ae%ba%e6%97%a0%e6%9d%83%e8%b7%af%e5%be%84%e7%ae%97%e6%b3%95%e5%ae%9e%e7%8e%b0/算法思想参考《数据结构与算法分析》教材。
与拓扑排序算法一样,首先使用邻接表实现DAG图,无权路径实际上就是路径权值为1的图。
对于每一个顶点,记录从其他顶点到此顶点的最短路径长度,用变量dist表示,进一步,再记录下到达此顶点的上一个顶点的值是多少。
数据结构上采用队列实现,实际就是一次广度优先搜索。具体见代码:
#include<cstdio> #include<iostream> #include<queue> using namespace std; #define MAX_VERTEX_NUM 100 #define Vertextype int #define Infinity 0xffff typedef struct EdgeNode { int adjVertex; EdgeNode *nextEdgeNode; }EdgeNode; typedef struct VerNode { Vertextype data; int dist; Vertextype path; EdgeNode *firstedge; }VerNode; typedef struct Graph { VerNode verNode[MAX_VERTEX_NUM]; int vertex_num,edge_num; }Graph; void CreateDAG(Graph &G,int n,int e) { int i,j,k; G.vertex_num=n; G.edge_num=e; for(i=1;i<=n;i++) { cin>>G.verNode[i].data; G.verNode[i].dist=Infinity; G.verNode[i].path=0; G.verNode[i].firstedge=NULL; } for(k=1;k<=e;k++) { EdgeNode *p; p=new EdgeNode; cin>>i>>j; p->adjVertex=j; p->nextEdgeNode=G.verNode[i].firstedge; G.verNode[i].firstedge=p; } } void Unweighted(Graph &G,int n) { queue<VerNode> Q; VerNode V; EdgeNode *w; G.verNode .dist=0; //起点处路径长度置为0 Q.push(G.verNode ); while(!Q.empty()) { V=Q.front();Q.pop(); w=V.firstedge; while(w) { if(G.verNode[w->adjVertex].dist==Infinity) { G.verNode[w->adjVertex].dist=V.dist+1; G.verNode[w->adjVertex].path=V.data; Q.push(G.verNode[w->adjVertex]); } w=w->nextEdgeNode; } } } int main() { int i; Graph G; CreateDAG(G,7,12); //给出图的顶点数及边数量 Unweighted(G,3); //指出起点 for(i=1;i<=7;i++) printf("%d ",G.verNode[i].path); //打印路径 } /*****测试数据 1 2 3 4 5 6 7 3 1 3 6 1 2 1 4 2 4 2 5 4 3 4 5 4 6 4 7 5 7 7 6 *******/查看原文:http://www.wyblog.cn/2016/12/07/%e5%9b%be%e8%ae%ba%e6%97%a0%e6%9d%83%e8%b7%af%e5%be%84%e7%ae%97%e6%b3%95%e5%ae%9e%e7%8e%b0/
相关文章推荐
- 图论无权路径算法实现
- 图论无权路径算法实现
- 图论无权路径算法实现
- 图论无权路径算法实现
- 图论无权路径算法实现
- 图论无权路径算法实现
- 图论无权路径算法实现
- 图论无权路径算法实现
- 图论无权路径算法实现
- 图论无权路径算法实现
- 图论无权路径算法实现
- 图论无权路径算法实现
- 图论无权路径算法实现
- 图论无权路径算法实现
- 图论无权路径算法实现
- 图论无权路径算法实现
- 图论无权路径算法实现
- 图论无权路径算法实现
- 图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路)Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
- 初学图论-Dijkstra单源最短路径算法基于优先级队列(Priority Queue)的实现