图论无权路径算法实现



查看原文: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[n].dist=0; //起点处路径长度置为0 Q.push(G.verNode[n]); 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/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值