最小生成樹——prim演算法實現
{
int sum=0;
string u;
int i,j;
cout<<"請輸入CARS初始用陣列:"<<endl;
for(i=0;i<max_vex;i++)
for(j=0;j<max_vex;j++)
cin>>arcs[i][j].s>>arcs[i][j].lowcast;
u="v1";
cout<<u; ////確定第一個結點
cout<<endl;
int k=locatevex(G,u);
for(j=0;j<G.size();j++)
if(j!=k) {closedge[j].s=u; closedge[j].lowcast=arcs[k][j].lowcast;} ////輔助陣列的初始化
closedge[k].lowcast=0;
closedge[k].s="NULL";
U.push_back(u); //////將第一個結點加入向量U中
for(i=1;i<G.size();i++)
{
k=minimum(closedge); /////找一個最短邊的下標
cout<<closedge[k].lowcast;
cout<<G[k];
cout<<endl;
sum+=closedge[k].lowcast; ///加兩結點間的路徑和
U.push_back(G[k]);
closedge[k].lowcast=0;
closedge[k].s="NULL";
for(j=0;j<G.size();j++)
if(arcs[k][j].lowcast<closedge[j].lowcast)
{
closedge[j].lowcast=arcs[k][j].lowcast;
closedge[j].s=G[k];
}
}
cout<<endl;
for(i=0;i<U.size();i++)
cout<<U[i]<<" ";
cout<<"輸出最小路徑為:"<<endl;
cout<<sum<<endl;
system("PAUSE");
return 0;
}
相關推薦
最小生成樹——prim演算法實現
int main(int argc, char *argv[]) { int sum=0; string u; int i,j; cout<<"請輸入CARS初始用陣列:"<<endl; for(i=0;i<max_vex;i++)
最小生成樹Prim演算法java實現
package prim; import java.util.*; public class PrimTest { public static void main(String[] args) { //互動輸入圖的鄰接矩陣表示,為方便測試,直接給定了鄰接矩陣值 // System
最小生成樹 prim演算法 C++實現
#include <iostream> #include <vector> #define Inf 0x7fffffff using namespace std; int mai
【演算法——Python實現】有權圖求最小生成樹Prim演算法
class Edge(object): """邊""" def __init__(self, a, b, weight): self.a = a # 第一個頂點 self.b = b # 第二個頂點
圖的最小生成樹prim演算法詳解
prim演算法是求圖的最小生成樹的一種演算法,它是根據圖中的節點來進行求解,具體思想大概如下: 首先,將圖的所有節點(我們假定總共有n個節點)分成兩個集合,V和U。其中,集合V儲存的是我們已經訪問過的節點,集合U儲存的是我們未曾訪問的節點。prim演算法第一步就是選定第一個節點放入集合
poj 2485 最小生成樹 Prim演算法 模板
嗯,沒錯是純模板,只要會模板就能ac的, 在這裡還是講一下模板的意思吧:大致就是現在起始點附近搜距離他最近的點v1,然後再以v1為點去搜距離v1最近的點,且之前都過的點不能再搜了,不明白的就去手畫一下過程吧。 程式碼: #include<cstdio> #include&
【資料結構】最小生成樹 Prim演算法 Kruskal演算法
選定一個開始的結點,在一個點集合中,其餘點在另一個點集合中,然後找取與這個結點相連的權值最小最小的邊,加入第一個點集合,之後再次找尋與這兩個節點相鄰的權值最小的邊加入,迴圈往復,直到所有的點都存在於第一個點集合中。 注意在選擇權值最小的邊時,不能夠形成迴路!!!! 不然
最小生成樹prim演算法(模板)
prim演算法適合稠密圖,即邊數較多而點較少的情況,時間複雜度為O(n2)O(n2),堆優化的情況下,如果點數為m,邊數為n,可以達到O(nlogm)O(nlogm).思想很簡單,就是每次尋找一條由已加入集合的點和與它們相鄰的沒加入集合的點的權值最小邊,進行n-
Java資料結構:最小生成樹---Prim演算法
日常更新資料結構 思想:通過選擇一個根結點,然後遍歷其所有的邊,選擇權重最小的一個邊。然後到達相應的結點,然後再從該邊出發,依舊選擇權重最小的邊到達下一個結點。(目的是為了使A到各個結點的權值和最小) 原圖為上述圖。 過程:A開始遍歷AB,AC,AD。發現AD權值最小,然後選擇AD
最小生成樹Prim演算法
template<class T> bool Graph<T>::Prim(const T& v,PathData* E,int ne) { int s=FindNode(v); if(s==-1) { return 0
最小生成樹 prim演算法(附程式碼)
prim演算法是以一個根節點開始慢慢往下延伸,不斷尋找距生成樹最短的距離的節點,然後將該節點納入生成樹的集合中,然後再將該節點影響的其他未納入生成樹節點的距離更新。(縮小與生成樹的距離),重複操作,直至全部節點納入集合或者沒有節點納入集合為止。 prim演算法的時間複雜度為
最小生成樹——Prim演算法
#define INF 0x3f3f3f3f int Map[110][110];//記錄節點間關係,可達記為1,否則記為0; bool vis[110];//記錄節點是否被遍歷; int dis[110]; void Prim() { memset(vis,false,sizeof(vis));
最小生成樹(prim演算法與kruskal演算法)(模板)
th寫的總結,很不錯,轉載一下:點選開啟連結 首先說一下什麼是樹: 1、只含一個根節點 2、任意兩個節點之間只能有一條或者沒有線相連 3、任意兩個節點之間都可以通過別的節點間接相連 4、除了根節點沒一個節點都只有唯一的一個父節點
最小生成樹--Prim演算法
最近研究圖論的演算法,接觸到構建最小生成樹的prim演算法(當然還有其他方法:Kruskal演算法也可以構建),所以記錄一下。 首先,什麼是最小生成樹? 百度百科給出的定義:一個有 n 個結點的連通圖的生成樹是原圖的極小連通子圖,且包含原圖中的所有 n 個結
最小生成樹Prim演算法理解
MST(Minimum Spanning Tree,最小生成樹)問題有兩種通用的解法,Prim演算法就是其中之一,它是從點的方面考慮構建一顆MST,大致思想是:設圖G頂點集合為U,首先任意選擇圖G中的一點作為起始點a,將該點加入集合V,再從集合U-V中找到另一點b使得點b到
最小生成樹prim演算法適合稠密圖(網路整理)8.12
這裡dist表示頂點到樹的距離 #include<stdio.h> #include<stdlib.h> /* 圖的鄰接矩陣表示法 */ #define MaxVertexNum 100
poj-1258 Agri-Net(最小生成樹 Prim演算法)
Agri-Net Time Limit:1000MS Memory Limit:10000KB Description Farmer John has been elected mayor of his town! One of his campaign pro
【Codevs1078】最小生成樹 Prim演算法(5/1000)
Description Farmer John has been elected mayor of his town! One of his campaign promises was to bring internet connectivity to all
最小生成樹 Prim演算法
一個無向帶權圖G=(V,E),其中n個頂點Vertex,以及連線各個頂點之間的邊Edge,可能有些頂點之間沒有邊,每條邊上的權值都是非負值。 生成樹: G的一個子圖,包含了所有的Vertex,和部分的Edge。 最小生成樹: 所有的生成樹中,各條Edge上的權值總和最小的一
最小生成樹-Prim演算法和Kruskal演算法
假設以下情景,有一塊木板,板上釘上了一些釘子,這些釘子可以由一些細繩連線起來。假設每個釘子可以通過一根或者多根細繩連線起來,那麼一定存在這樣的情況,即用最少的細繩把所有釘子連線起來。 更為實際的情景是這樣的情況,在某地分佈著N個村莊,現在需要在N個村莊之間修路,每個村莊