最短路之dijkstra

2021-08-25 02:20:28 字數 1637 閱讀 1669

覺得這篇博文講的很不錯:click here

下面的**可直接用來ac這道題目:hdu-暢通工程續(click here

)乙個用鄰接矩陣存圖的模板。鄰接矩陣存圖主要用於點比較少的(5000個點還是可以的),邊比較多的情況。由於二位陣列不能開過於大,所以這也是鄰接矩陣存圖的限制吧!

djk求單源最短路,鄰接矩陣存圖 

#include #include #include using namespace std;

typedef long long ll;

const int maxn = 5005;

const int inf = 0x3f3f3f3f;

int n, m;

int mmp[maxn][maxn];//鄰接矩陣存圖

bool vis[maxn];//對點進行標記

int dis[maxn];//從起點到各個點的最短距離

void init(int n)//對圖進行初始化

}}void getmap(int m)//建圖

}void djk(int st, int ed)//起點為st,終點為ed;

vis[st] = true;//將起點放入vis陣列中

for(int i=1; i<=n-1; i++)//對除了起點之外的邊進行遍歷,即一共遍歷嗯n-1次,為的是將它依次放入vis陣列中}}

}if(dis[ed]!=inf) cout<< dis[ed] <> x >> y;

x++; y++;//切記要看清題目中的城市編號。

djk(x,y);

}return 0;

}

思想和上面是一樣的,只不過是存圖方式改變了而已。

#include using namespace std;

typedef long long ll;

typedef unsigned long long ull;

typedef pairpii;

#define clr(a,b) memset(a,b,sizeof(a));

const int n = (int)1e5+10; //最大點數

const int m = (int)1e6+10; //最大邊數

const int inf = (int)0x3f3f3f3f;

int n, m; //n是圖中點的數目,m是圖中邊的數目

int head[n], top;

bool vis[n];

int dis[n]; //儲存結果

struct edge //邊的定義

edge(int _to, int _val, int _next)

}edge[m << 1]; //如果是雙向圖的的話,邊的數量是題目中描述的二倍

void init()

void add(int u, int v, int val) //加單向邊

void getmap(int m)

}void dijkstra(int st, int ed)}}

printf("%d\n", dis[ed]==inf ? -1 : dis[ed]);

}int main()

return 0;

}

最短路之dijkstra演算法

dijkstra演算法 1.定義概覽 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有 節點的最短路徑。主要特點是 以起始點為中 心向外層層擴充套件,直到擴充套件到終點為止。問題描述 在無向圖 g v,e 中,假設每條邊 e i 的長度為 w i 找到由頂點...

最短路演算法之 Dijkstra演算法

dijkstra演算法 dijkstra演算法是典型最短路演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。dijkstra演算法是用來求任意兩個頂...

最短路徑之 Dijkstra模板

一 時間複雜度為o v v 的dijkstra const int max v 100 10 const int inf 1 30 int cost max v max v 權值 int d max v 頂點 出發最短距離 bool used max v 以使用過的圖 int v 頂點數 int e...