覺得這篇博文講的很不錯: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...