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

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

有向無環圖的最短路徑

2019-11-14 10:59:02
字體:
來源:轉載
供稿:網友

給定一個有向無環圖和源點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
清纯唯美亚洲激情| 亚洲精品日韩久久久| 欧美日韩午夜激情| 亚州国产精品久久久| 欧美一区二区三区……| 亚洲自拍高清视频网站| 狠狠躁夜夜躁人人爽天天天天97| 亚洲综合在线中文字幕| 欧美专区福利在线| 国产午夜精品免费一区二区三区| 欧美激情精品久久久久久变态| 欧美激情一区二区久久久| 超碰日本道色综合久久综合| 成人久久精品视频| 欧美日韩午夜视频在线观看| 懂色aⅴ精品一区二区三区蜜月| 国产精品国产三级国产aⅴ浪潮| 国产噜噜噜噜久久久久久久久| 欧美在线视频播放| 中文字幕亚洲欧美日韩2019| 欧美国产日韩一区| 国产精品久久久久久久久久ktv| 96精品久久久久中文字幕| 日韩欧美在线视频免费观看| 亚洲精品国产精品乱码不99按摩| 成人伊人精品色xxxx视频| 亚洲欧美日韩图片| 亚洲午夜未删减在线观看| 久久久久久97| 国产亚洲一区二区在线| 国产精品igao视频| 欧美日韩成人在线视频| 亚洲免费电影在线观看| 国产精品主播视频| 欧美专区中文字幕| 日韩精品免费在线视频观看| 欧美视频免费在线| 欧美成人全部免费| 一本色道久久综合狠狠躁篇的优点| 91在线高清免费观看| 午夜精品一区二区三区在线视频| 久久91亚洲人成电影网站| 91久久在线视频| 久久成人18免费网站| 在线亚洲午夜片av大片| 欧美成人一区在线| 国产精品高精视频免费| 色yeye香蕉凹凸一区二区av| 国产国语刺激对白av不卡| 国产亚洲成av人片在线观看桃| 日韩在线免费观看视频| 欧美日韩一区二区免费视频| 国产精品久久久久国产a级| 26uuu亚洲伊人春色| 国产精品日日摸夜夜添夜夜av| 久久久久久久久久久亚洲| 91久久精品国产91久久性色| 久久精品亚洲一区| 日韩国产欧美精品一区二区三区| 91tv亚洲精品香蕉国产一区7ujn| 久久久久久久久中文字幕| 国产视频一区在线| 久久噜噜噜精品国产亚洲综合| 久久露脸国产精品| 亚洲美女av在线播放| 91大神福利视频在线| 欧美成人在线网站| 亚洲精品久久久久久久久久久久| 久久久久亚洲精品国产| 欧美色图在线视频| 久久久久久久久久国产| 亚洲成人久久一区| 日韩高清电影免费观看完整| 欧美日韩中文字幕综合视频| 欧美日韩在线影院| 国产精品∨欧美精品v日韩精品| 国产一区二区视频在线观看| 成人黄色短视频在线观看| 97超级碰碰人国产在线观看| 韩国三级电影久久久久久| 欧美精品激情blacked18| 亚洲成人动漫在线播放| 97在线视频免费播放| 欧美男插女视频| 一个色综合导航| 青青久久av北条麻妃黑人| 国产精品日韩欧美| 青草热久免费精品视频| 中文字幕亚洲一区二区三区五十路| 欧美电影在线观看高清| 91麻豆国产语对白在线观看| 欧美激情va永久在线播放| 精品国产一区久久久| 自拍亚洲一区欧美另类| 韩国美女主播一区| 亚洲成人激情在线| 日本一区二区不卡| 久99九色视频在线观看| 国产精品丝袜一区二区三区| 97精品国产97久久久久久春色| 亚洲激情 国产| 亚洲精品网站在线播放gif| 亚洲最大福利网| 伊人av综合网| 精品亚洲aⅴ在线观看| 日本精品一区二区三区在线| 欧美成在线观看| 久久久久久尹人网香蕉| 久久久国产精品视频| 欧美精品日韩三级| 久久综合免费视频| 国产成人一区二区三区电影| 91在线观看欧美日韩| 中文字幕欧美在线| 亚洲人成免费电影| 欧美特级www| 亚洲欧洲在线视频| 欧美一区二区影院| 国产欧美一区二区三区久久| 亚洲**2019国产| 国产91久久婷婷一区二区| 日韩av日韩在线观看| 国产视频精品xxxx| 性欧美长视频免费观看不卡| 亚洲综合在线小说| 亚洲精品一区在线观看香蕉| 欧美做爰性生交视频| 国产一区二区三区高清在线观看| 久久久久久亚洲精品中文字幕| 国产精品一区二区久久精品| 欧美最猛性xxxxx亚洲精品| 欧美极品xxxx| 久久久久久久激情视频| 亚洲福利视频在线| 国产精品久久久久久久久男| 国产日韩精品在线观看| 在线亚洲欧美视频| 日韩小视频在线观看| 国产91精品黑色丝袜高跟鞋| 久久精品国产一区二区三区| 欧美成人激情视频| 欧美精品久久久久久久久| 视频在线一区二区| www.日韩欧美| 91精品中国老女人| 亚洲视频在线看| 俺去亚洲欧洲欧美日韩| 欧美精品在线网站| 欧美另类交人妖| 2021国产精品视频| 91人人爽人人爽人人精88v| 欧美成人精品激情在线观看| 国产91精品不卡视频| 亚洲性线免费观看视频成熟| 亚洲免费一级电影| 国产亚洲欧洲高清一区| 国内精品视频久久| 亚洲第一免费网站| 亚洲欧美国产精品久久久久久久| 亚洲电影免费观看高清完整版| 96pao国产成视频永久免费| 国产一区二区三区高清在线观看| 久久久久久久激情视频| 日韩激情av在线播放|