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

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

有向無環圖的最短路徑

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

給定一個有向無環圖和源點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
欧美日韩一区二区三区在线免费观看| 92看片淫黄大片看国产片| 欧美刺激性大交免费视频| 国产亚洲精品日韩| 97av在线视频免费播放| 亚洲bt天天射| 欧美激情免费观看| 亚洲欧美精品伊人久久| 欧美中文在线观看| 亚洲的天堂在线中文字幕| 精品二区三区线观看| 久久久91精品国产一区不卡| 亚洲精品综合精品自拍| 色青青草原桃花久久综合| 美女福利视频一区| 欧美国产精品va在线观看| 国产精品啪视频| 欧美日韩激情美女| 一区二区三区黄色| 97av在线影院| 亚洲影院在线看| 91精品综合久久久久久五月天| 亚洲免费伊人电影在线观看av| 亚洲成人黄色在线观看| 国产一区二区丝袜高跟鞋图片| 777国产偷窥盗摄精品视频| 少妇激情综合网| 国产成人精品久久久| 久久国产精品亚洲| 亚洲在线免费观看| 亚洲性av网站| 亚洲精品成人免费| 精品久久久久久久久久国产| 精品亚洲va在线va天堂资源站| 91精品久久久久久久久不口人| 欧美国产日韩一区| 国产裸体写真av一区二区| 欧美日韩一区二区三区在线免费观看| 国产精品揄拍一区二区| 欧美放荡办公室videos4k| 日韩高清有码在线| 亚洲韩国日本中文字幕| 国产精品成人品| 欧美性精品220| 国产又爽又黄的激情精品视频| 91精品国产色综合| 久久久久亚洲精品成人网小说| 日韩专区在线播放| 日韩国产中文字幕| 国产精品无av码在线观看| 亚洲欧洲在线看| 国产精品福利久久久| 成人免费网站在线看| 久久精品99久久香蕉国产色戒| 国产午夜精品全部视频播放| 欧美高清videos高潮hd| 日韩电影在线观看永久视频免费网站| 亚洲天堂男人天堂| 77777亚洲午夜久久多人| 欧美大片免费观看| 琪琪第一精品导航| 国产美女精品免费电影| 欧美激情视频三区| 精品久久久香蕉免费精品视频| 国产欧美精品一区二区三区-老狼| 欧美色道久久88综合亚洲精品| 亚洲天堂日韩电影| 性欧美亚洲xxxx乳在线观看| 日韩网站免费观看高清| 另类少妇人与禽zozz0性伦| 国产精品视频永久免费播放| 海角国产乱辈乱精品视频| 中文字幕v亚洲ⅴv天堂| 国产精品视频一区二区高潮| 欧美成人免费一级人片100| 亚洲国产精品va在线| 日韩av三级在线观看| 精品亚洲精品福利线在观看| 亚洲第一页在线| 日韩中文字幕av| 欧美黄色片视频| 中日韩美女免费视频网站在线观看| 亚洲aaa激情| 久久久久久亚洲精品不卡| 日韩高清电影免费观看完整版| 九九热这里只有精品免费看| 国产国产精品人在线视| 亚洲高清久久网| 国产午夜精品一区二区三区| 国产日韩欧美91| 隔壁老王国产在线精品| 最近更新的2019中文字幕| 亚洲欧美日本精品| www.久久撸.com| 亚洲一区二区黄| 国产精品久久综合av爱欲tv| 久久免费国产精品1| 亚洲欧美自拍一区| 成人激情在线观看| 国产一区二区三区日韩欧美| 亚洲成人精品久久| 色狠狠av一区二区三区香蕉蜜桃| 国产精品久久久久免费a∨大胸| 欧美激情第99页| 国产欧美日韩视频| 成人性生交xxxxx网站| 91久久精品国产91久久性色| 日本不卡视频在线播放| 午夜精品一区二区三区av| 国产一区二区黄| 中文字幕在线日韩| 97在线观看免费| 日韩av理论片| 欧美国产精品日韩| 亚洲精品456在线播放狼人| 精品亚洲一区二区三区在线播放| 欧美另类xxx| 日本成人在线视频网址| 97精品在线视频| 日本久久久久久久| 不卡中文字幕av| 亚洲综合一区二区不卡| 亚洲精品之草原avav久久| 欧美大片在线看免费观看| 中文字幕av一区| 亚洲欧美日韩在线高清直播| 久久久久久久一区二区| 国产精品久久9| 国产亚洲精品久久久久久牛牛| 日韩美女在线观看| 久久精品电影一区二区| 日本三级久久久| 日韩av在线导航| 国产精品日韩在线一区| 福利视频一区二区| 国产精品日日做人人爱| 日韩免费在线电影| 日韩福利伦理影院免费| 日韩av手机在线看| 久久久久久久久久久久av| 亚洲自拍偷拍视频| 久久久久亚洲精品国产| 国产视频精品免费播放| 欧美壮男野外gaytube| 亚洲午夜久久久影院| 久久国产视频网站| 久久97久久97精品免视看| 欧美大成色www永久网站婷| 国产精品视频久久久| 91精品免费看| 国产免费一区视频观看免费| 欧美成人久久久| 精品一区二区电影| 97久久超碰福利国产精品…| 国产精品视频999| 国产精品成人一区二区三区吃奶| 欧美俄罗斯性视频| 高清一区二区三区日本久| 91精品国产自产在线观看永久| 88国产精品欧美一区二区三区| 91精品久久久久久久久久久久久久| 国产mv免费观看入口亚洲| 亚洲国产天堂久久国产91| 国产精品免费视频久久久|