您的位置:首页 > 其它

图论无权路径算法实现

2016-12-07 11:26 204 查看
查看原文: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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: