亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

有向無環圖的最短路徑

2019-11-14 11:50:42
字體:
來源:轉載
供稿:網友

給定一個有向無環圖和源點s,并求s到其它各頂點的最短路徑,在圖中無負邊時,通常采用Dijkstra算法(O(V^2)); 有負邊是則采用Bellman-Ford算法(O(VE));均無法在線性時間內得到結果,而如果先對鄰接表結構的有向圖采用拓撲排序,得到排序后的數組PRint,然后從源點開始更新鄰接結點的最小路徑,最終可得到源點到其它所有結點的最短路徑

關于拓撲排序,核心是先將所有入度為0的結點入棧,然后依次出棧(用print數組保存),同時將鄰接結點入度減1(減為0時要入棧)

下面這張圖很好地顯示了具體的流程:

下面的C代碼采用的是上面的算法

#include <stdio.h>#include <stdlib.h>#include <string.h> #define MaxSize 1000#define TRUE 1#define FALSE 0 #define INF 0x3f3f3f3f//1061109567 //typedef int VertexType;//邊表結點typedef struct arcnode{	int adjvex; //鄰接點域,存儲頂點對應的下標 	int weight; 	struct arcnode *nextarc; //鄰域,指向下一個鄰接點 }ArcNode;//頂點表typedef struct{//	VertexType data;	ArcNode *firstarc; //邊表頭結點 }VNode; //鄰接表定義typedef struct{	VNode adjlist[MaxSize];	int n,e;}AGraph;//順序棧typedef struct{	int top;	int data[MaxSize];}SqStack;int indegree[MaxSize],print[MaxSize],min_dis[MaxSize];//print為拓撲排序后的結果 void InitStack(SqStack *S){      S->top = -1;   }  void Push(SqStack *S,int i){      S->data[++(S->top)] = i;  }  void Pop(SqStack *S,int *i){      *i = S->data[S->top--];  }  int IsEmpty(SqStack S){      if(S.top == -1)          return TRUE;      else{          return FALSE;      }  } void CreateGraph(AGraph *G){	int tail,head,w;	for( int i = 0 ; i < G->n ; i ++ ) //初始化頂點表指針 		G->adjlist[i].firstarc = NULL;	for( int i = 0 ; i < G->e ; i ++ ){		scanf("%d%d%d",&tail,&head,&w);		indegree[head] ++;		//頭插法 		ArcNode *p = (ArcNode *)malloc(sizeof(ArcNode));		p->nextarc = G->adjlist[tail].firstarc;		G->adjlist[tail].firstarc = p;//		p->adjvex = head;		p->weight = w;	}}void TopologicalSort(AGraph G){	SqStack S; //用棧或隊列都可以	InitStack(&S);	for( int i = 0 ; i < G.n ; i ++ )		if(!indegree[i])			Push(&S,i);	int count = 0;	while(!IsEmpty(S)){		int index;		Pop(&S,&index);		print[count ++] = index;		for(ArcNode *p = G.adjlist[index].firstarc ; p ; p = p->nextarc){			if(!(-- indegree[p->adjvex]))				Push(&S,p->adjvex);		}	}}void ShortestPath(AGraph G,int s){	int index;	for(int i = 0 ; i < G.n ; i ++ )		if(print[i] == s){			index = i;			break;		}	//更新最小路徑長度(如果要記載具體路徑,記住前驅結點即可,初始化均為源點) 	int s1;	for(int i = index ; i < G.n ; i ++ ){//源點前面的結點到源點距離固定為INF		s1 = print[i] ;		for(ArcNode *p = G.adjlist[s1].firstarc ; p ; p = p->nextarc){			if(min_dis[p->adjvex] > min_dis[s1] + p->weight)				min_dis[p->adjvex] = min_dis[s1] + p->weight;		}	}	//ShowPathLen	for( int i = 0 ; i < G.n ; i ++ ){		printf("%d->%d:",s,print[i]);		if(min_dis[i] == INF)			printf("INF/n");		else printf("%d/n",min_dis[i]);	}}int main(){	AGraph G;	while(~scanf("%d%d",&G.n,&G.e)){		memset(indegree,0,sizeof(indegree));		CreateGraph(&G);		TopologicalSort(G);		int s;		scanf("%d",&s);		memset(min_dis,INF,sizeof(min_dis[0])*(G.n));		min_dis[s] = 0;		ShortestPath(G,s);	}	return 0;}

下面的C++代碼參照的是最下面的網址上的代碼

#include <iostream>#include <list>#include <cstring>#include <stack>const int INF = INT_MAX;using namespace std;//鄰接表結點 class AdjacentListNode{	int v;	int w;public:	AdjacentListNode(int _v,int _w){ //帶參構造函數		v = _v , w = _w ;	}	int GetNode() { return v; }	int GetWeight() { return w; }};//圖 class Graph{	int V; 	list<AdjacentListNode> *adj;	void TopologicalSort(int v, bool visited[], stack<int> &stk); // public:	Graph(int V); //構造函數一般public 	void AddEdge(int u, int v, int w);	void ShortestPath(int s);};Graph::Graph(int V){ //構造函數不返回任何值 	this->V = V;	adj = new list<AdjacentListNode>[V]; //V個邊表結點指針 }void Graph::AddEdge(int u, int v, int w){	AdjacentListNode node(v,w); //實類化對象 	adj[u].push_back(node);}void Graph::TopologicalSort(int v, bool visited[], stack<int> &stk){  	visited[v] = true;	for(list<AdjacentListNode>:: iterator i = adj[v].begin() ; i != adj[v].end() ; i ++ ) {		if(!visited[i->GetNode()])			TopologicalSort(i->GetNode(),visited,stk);	}	stk.push(v);//圖的后繼結點 必后入棧 }void Graph::ShortestPath(int s){	stack<int> stk;	int min_dis[V]; //不需要動態開辟	bool visited[V];	memset(visited,false,sizeof(visited));//	memset(min_dis,INF,sizeof(min_dis)); //-1	for(int i = 0 ; i  < V ; i ++ )		min_dis[i] = INF;	min_dis[s] = 0;	//拓撲排序 	for(int i = 0; i < V ; i ++ )		if(!visited[i])			TopologicalSort(i,visited,stk);	//求最短路徑	while(!stk.empty()) {		int u = stk.top();		stk.pop();		//更新所有相鄰的結點		list<AdjacentListNode>:: iterator i; //迭代器(指針作用) 		if(min_dis[u] != INF){ //0之前為INF的都自動略過 			for(i = adj[u].begin(); i != adj[u].end() ; i ++ ){				if(min_dis[i->GetNode()] > min_dis[u] + i->GetWeight())						min_dis[i->GetNode()] = min_dis[u] + i->GetWeight();			}				}	}	for(int i = 0 ; i < V ; i ++ )		(min_dis[i] == INF) ? cout << "INF " : cout << min_dis[i] << " ";} int main(){	Graph g(6); 	g.AddEdge(4,5,-2);	g.AddEdge(0,1,5);	g.AddEdge(0,2,3);	g.AddEdge(1,3,6);	g.AddEdge(1,2,2);	g.AddEdge(2,4,4);	g.AddEdge(2,5,2);	g.AddEdge(2,3,7);	g.AddEdge(3,4,-1);	int s = 1;	cout << "Following are the shortest distances from source:" << endl;	g.ShortestPath(s);	return 0;}

測試樣例:

6 9

4 5 -2

0 1 5

0 2 3

1 3 6

1 2 2

2 4 4

2 5 2

2 3 7

3 4 -1

1

6 9

0 1 5

1 2 2

4 5 -2

0 2 3

2 5 2

1 3 6

2 4 4

2 3 7

3 4 -1

3

參考資料:

      http://www.acmerblog.com/shortest-path-for-directed-acyclic-graphs-5891.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美在线一级视频| 欧美午夜影院在线视频| 国产成人中文字幕| 岛国av一区二区| 国内偷自视频区视频综合| 成人久久久久爱| www.亚洲成人| 丰满岳妇乱一区二区三区| 亚洲精品成人免费| 久久久精品999| 国产日韩综合一区二区性色av| 亚洲久久久久久久久久久| 九色精品免费永久在线| 亚洲欧洲第一视频| 91国产中文字幕| 亚洲电影免费在线观看| 欧美日韩免费区域视频在线观看| 精品色蜜蜜精品视频在线观看| 黄网动漫久久久| 国产精品男人的天堂| 国产91精品久| 日韩欧美中文字幕在线观看| 成人精品久久久| 8x拔播拔播x8国产精品| 97国产精品视频人人做人人爱| 国产精品爱啪在线线免费观看| zzijzzij亚洲日本成熟少妇| 亚洲欧洲xxxx| 日韩风俗一区 二区| 日本欧美国产在线| 成人久久18免费网站图片| 91国产美女在线观看| 日本欧美在线视频| 久久五月情影视| 91精品国产综合久久香蕉最新版| 日韩中文娱乐网| 在线观看久久久久久| 欧美性videos高清精品| 中文国产成人精品| 国产精品第一页在线| 中文字幕日韩在线播放| 国产视频精品va久久久久久| 久久国产精品网站| 亚洲精品suv精品一区二区| 国产精品免费一区豆花| 夜色77av精品影院| 日本在线观看天堂男亚洲| 久久久久久久久国产精品| 日韩电影中文字幕| 隔壁老王国产在线精品| 国产精品久久久久久久久久免费| 久久久91精品| 欧美性xxxxx极品娇小| 久久精品国产久精国产思思| 中文字幕久热精品视频在线| 欧美大片第1页| 亚洲国模精品一区| 亚洲激情视频在线播放| 欧美激情女人20p| 九九精品视频在线观看| 性欧美xxxx视频在线观看| 久久九九免费视频| 欧美日韩国产精品一区| 57pao精品| 欧美国产第一页| 亚洲精品国产品国语在线| 欧美日韩国产影院| 久久免费视频观看| 狠狠久久五月精品中文字幕| 日韩精品免费看| 国产999精品久久久影片官网| 2020欧美日韩在线视频| 91丨九色丨国产在线| 精品国产一区二区在线| 亚洲性夜色噜噜噜7777| 亚洲国产日韩欧美综合久久| 欧美日韩午夜视频在线观看| 精品视频在线观看日韩| 欧美一级大片在线免费观看| 亚洲黄页视频免费观看| 欧美性生活大片免费观看网址| 欧美精品国产精品日韩精品| 久热精品视频在线免费观看| 亚洲伊人成综合成人网| 久久久免费观看视频| 精品国偷自产在线| 91wwwcom在线观看| 亚洲午夜av久久乱码| 91牛牛免费视频| 国产黑人绿帽在线第一区| 日韩成人av在线播放| 日韩av在线免播放器| 日韩在线观看免费av| 亚洲性xxxx| 亚洲天堂日韩电影| 亚洲一区二区自拍| 国产精品情侣自拍| 欧美日韩中文在线观看| 国产亚洲xxx| 亚洲三级av在线| 久久精品视频一| 国产97色在线| 欧美理论电影在线观看| 国产日韩在线亚洲字幕中文| 91久久精品视频| 亚洲国产精品嫩草影院久久| www.久久久久久.com| 亚洲人成网站色ww在线| 久久资源免费视频| 久久天天躁狠狠躁夜夜躁| 国产亚洲欧美aaaa| 91精品久久久久久久久久久久久久| www欧美日韩| 国产一区二区三区18| 在线精品视频视频中文字幕| 成人性生交大片免费看视频直播| 精品久久香蕉国产线看观看gif| 亚洲a一级视频| 97色在线观看免费视频| 国产99久久精品一区二区 夜夜躁日日躁| 91精品国产自产91精品| 在线亚洲男人天堂| 欧美激情成人在线视频| 亚洲石原莉奈一区二区在线观看| 国产成人综合精品在线| 国产精品人成电影| 国产精品日韩在线一区| 国产婷婷97碰碰久久人人蜜臀| 国产日韩精品在线| 91av在线视频观看| 91在线播放国产| 亚洲天堂网站在线观看视频| 欧美大片网站在线观看| 日韩av免费在线观看| 亚洲精品国产精品国自产在线| 亚洲欧洲国产精品| 亚洲一级黄色av| 国产日韩在线看片| 久久久久久免费精品| 最近中文字幕mv在线一区二区三区四区| 2019亚洲日韩新视频| 久久6精品影院| 欧美一级片久久久久久久| 日韩在线精品视频| 91精品国产自产在线观看永久| 国产有码在线一区二区视频| 中文字幕自拍vr一区二区三区| 久久国产精彩视频| 欧美日韩国产一区中文午夜| 成人黄色av免费在线观看| 日本国产高清不卡| 欧美大片网站在线观看| 久久电影一区二区| 欧美成人精品不卡视频在线观看| 欧美日韩一区二区在线播放| 日韩在线欧美在线国产在线| 日韩综合视频在线观看| 久久国产精品视频| 黑人巨大精品欧美一区二区三区| 欧美日韩色婷婷| 国产精品aaaa| 欧美激情xxxx| 亚洲欧美在线一区二区| 日韩精品在线视频美女|