查看原文: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/