資料結構------最短路徑Dijkstra和最小生成樹Prim
prim和Dijkstra演算法主要是在d陣列上面的含義不同,對於prim的d陣列是d[i]是i節點到最小生成樹結合的距離,而Dijkstra的d陣列則是i節點到目標節點s的距離。
最短路徑並用path並查集陣列來記錄路徑節點資訊
#include <bits/stdc++.h>
#define maxv 1000
#define INF 99999
using namespace std;
int n,m,s;/*n個頂點、m條邊、s為起點*/
int path[maxv];/*一個並查集陣列*/
int G[maxv][maxv];
int d[maxv];/*d[i]代表著第i個節點到目標節點s的距離*/
bool vis[maxv]={false};
int findfater(int x){
int index=x;
int temp[100];
int top=0;
temp[top++]=x;
while(path[x]!=x){
//cout<<x<<' ';
x=path[x];
temp[top++]=x;
}
//temp[top++]=x;
for(int i=top-1;i>=0;i--){
if(d[index]==INF){
cout<<s<<" 不可達 "<<i;
break;
}
else if(d[index]==0){
cout<<"自身節點";
break;
}
if(i!=0){
cout<<temp[i]<<"-->";
}else{
cout<<temp[i]<<"\t\t路徑長度為"<<d[index];
}
}
cout<<endl;
}
int initpath(int n){
for(int i=0;i<n;i++){
path[i]=i;
}
}
void InitG(){
for(int i=0;i<maxv;i++){
for(int j=0;j<maxv;j++){
G[i][j]=INF;
}
}
}
/*m為目標節點*/
void Dijkstra(int s,int n){
initpath(n);
//path[s]=s;//並查集初始化
fill(d,d+maxv,INF);
d[s]=0;
for(int i=0;i<n;i++){
int u=-1,Min=INF;
for(int j=0;j<n;j++){
if(vis[j]==false&&d[j]<Min){
u=j;
Min=d[j];
}
}
if(u==-1){
return ;
}
vis[u]=true;
for(int v=0;v<n;v++){
if(vis[v]==false&&G[u][v]!=INF&&G[u][v]+d[u]<d[v]){
d[v]=G[u][v]+d[u];
path[v]=u;
}
}
}
}
int main()
{
cout<<"請輸入頂點數和邊數:"<<endl;
cin>>n>>m>>s;
int u,v,weight;
InitG();/*初始化全部為INF*/
for(int i=0;i<m;i++){
cin>>u>>v>>weight;
if(weight<G[u][v]){/*防止這個兩個頂點之間存在多條邊*/
G[u][v]=weight;
}
}
Dijkstra(s,n);
for(int i=0;i<n;i++){
findfater(i);
}
return 0;
}
/*6個頂點 8條邊 以0號節點為例子
6 8 1
0 1 1
0 3 4
0 4 4
1 3 2
2 5 1
3 2 2
3 4 3
4 5 3
0 1 5 3 4 6
*/
Prim演算法
#include <bits/stdc++.h>
#define maxv 1000
#define INF 99999
using namespace std;
int G[maxv][maxv];
int d[maxv];/*d[i]代表著第i個節點到結合S的距離*/
bool vis[maxv]={false};
void InitG(){
for(int i=0;i<maxv;i++){
for(int j=0;j<maxv;j++){
G[i][j]=INF;
}
}
}
int prim(int n){
int ans=0;
fill(d,d+maxv,INF);
d[0]=0;
for(int i=0;i<n;i++){
int u=-1,Min=INF;
for(int j=0;j<n;j++){
if(vis[j]==false&&d[j]<Min){
u=j;
Min=d[j];
}
}
if(u==-1){
return -1;
}
vis[u]=true;
ans+=d[u];
for(int v=0;v<n;v++){
if(vis[v]==false&&G[u][v]!=INF&&G[u][v]<d[v]){
d[v]=G[u][v];
}
}
}
return ans;
}
int main()
{
int n,m;
cout<<"請輸入頂點數和邊數:"<<endl;
cin>>n>>m;
int u,v,weight;
InitG();/*初始化全部為INF*/
for(int i=0;i<m;i++){
cin>>u>>v>>weight;
if(weight<G[u][v]){
G[v][u]=G[u][v]=weight;
}
}
cout<<prim(n);
return 0;
}
/*
6 10
0 1 4
0 4 1
0 5 2
1 2 6
1 5 3
2 3 6
2 5 5
3 4 4
3 5 5
4 5 3
結果為15
*/
相關文章
- Prim 最小生成樹 圖解圖解
- 最小生成樹__Prim演算法演算法
- 最小生成樹之 Prim 演算法演算法
- 最小生成樹——Prim演算法和Kruscal演算法演算法
- 最小生成樹:Kruskal演算法和Prim演算法演算法
- 最小生成樹-Prim演算法和Kruskal演算法演算法
- 最小生成樹之Prim演算法和Kruskal演算法演算法
- 最小生成樹prim普里姆演算法演算法
- 資料結構與演算法——最短路徑Dijkstra演算法的C++實現資料結構演算法C++
- 圖論之帶權圖「最小生成樹之Prim」圖論
- 最小生成樹(克魯斯卡爾演算法)資料結構演算法資料結構
- 資料結構與演算法之最好學的最小生成樹資料結構演算法
- 資料結構和演算法學習筆記九:最短路徑資料結構演算法筆記
- 最短路徑之Dijkstra演算法演算法
- 圖論之帶權圖「最小生成樹prim的優化」圖論優化
- POJ2031 Building a Space Station(最小生成樹,prim)UI
- 最短路徑——Dijkstra演算法和Floyd演算法演算法
- 最短路徑—Dijkstra演算法和Floyd演算法演算法
- 圖論之帶權圖「最小生成樹prim的最佳化」圖論
- 最短路徑問題 (dijkstra演算法)演算法
- 單源最短路徑-Dijkstra演算法演算法
- 單源最短路徑 -- Dijkstra演算法演算法
- 演算法與資料結構之-圖的最短路徑演算法資料結構
- 資料結構學習(C++)——圖【4】(最短路徑) (轉)資料結構C++
- 演算法與資料結構之帶權圖與圖最小生成樹演算法資料結構
- 最小生成樹的性質與prim演算法(C++實現)演算法C++
- 資料結構——樹和森林資料結構
- 資料結構和演算法學習筆記八:帶權連通圖的最小生成樹資料結構演算法筆記
- EasyTree 一個生成樹型資料結構最簡單的方式資料結構
- 資料結構 最短路徑之—迪傑斯特拉演算法資料結構演算法
- 圖的單源最短路徑(Dijkstra演算法)演算法
- 最小生成樹
- Delphi中根據分類資料生成樹形結構的最優方法 (轉)
- 【JAVA演算法】圖論演算法 --求最小生成樹Prim演算法Java演算法圖論
- 樹形結構資料儲存方案(二): 物化路徑
- 最短路徑——dijkstra演算法程式碼(c語言)演算法C語言
- 最短路徑—Dijkstra(迪傑斯特拉)演算法演算法
- 0016:單源最短路徑(dijkstra演算法)演算法