1. 程式人生 > >最小生成樹prime演算法模板

最小生成樹prime演算法模板

#include<stdio.h>
#include<string.h>
using namespace std;
int map[505][505];
int v, e;
int prime()
{
  bool vis[505];
  int dist[505];
    int i,j,sum=0;
  for(i=1;i<=v;i++)
  {
    vis[i]=0;
    //先假設編號為1的點加入MST 
    dist[i]=map[1][i];
  }
  vis[1]=1;
  for(i=1;i<v;i++)
  {
    int k,min=0x3f3f3f3f;
    for(j=1;j<=v;j++)
    {
      if(!vis[j]&&dist[j]<min)
      {
        min=dist[j];
        k=j;
      }
    }
    /*
    在這也統計下加入了幾天邊,判斷是否構成MST 
    */
    sum+=dist[k];
    vis[k]=1;
    //下面更新已加入最小生成樹的點離其它點的最短距離 
    for(j=1;j<=v;j++)
    {
      if(!vis[j]&&dist[j]>map[k][j])
        dist[j]=map[k][j];
    }
  }
  return sum;
}
int main()
{
  int n;
  int i;
  int waibu;
  scanf("%d", &n);
  while(n--)
  {
    memset(map, 0, sizeof(map));
    scanf("%d %d", &v, &e);
    
    int a, b, c;
    for(i = 0; i< e; i++)
    {
      scanf("%d %d %d", &a, &b, &c);
      map[a][b] = c;
      map[b][a] = c;
    }
    int min = 0x3f3f3f3f;
    for(i = 0; i< v; i++)
    {
      scanf("%d", &waibu);
      if(min > waibu)
        min = waibu;
    }
    printf("%d\n", prime() + min);
  }
  return 0;
}       

相關推薦

小生成樹prime演算法模板

#include<stdio.h> #include<string.h> using namespace std; int map[505][505]; int v, e; int prime() { bool vis[505]; int d

MST(小生成樹)-Prime演算法

Prime演算法的核心步驟是:在帶權連通圖中V是包含所有頂點的集合, U已經在最小生成樹中的節點,從圖中任意某一頂點v開始,此時集合U={v},重複執行下述操作:在所有u∈U,w∈V-U的邊(u,w)∈E中找到一條權值最小的邊,將(u,w)這條邊加入到已找到邊的集合,並且將點w加入到集合U中,當U=

poj 2485 小生成樹 Prim演算法 模板

嗯,沒錯是純模板,只要會模板就能ac的, 在這裡還是講一下模板的意思吧:大致就是現在起始點附近搜距離他最近的點v1,然後再以v1為點去搜距離v1最近的點,且之前都過的點不能再搜了,不明白的就去手畫一下過程吧。 程式碼: #include<cstdio> #include&

(Java資料結構和演算法小生成樹---prime演算法

參考博文 public class Main { public static void main(String[] args){ int inf = 1000000;//無窮大 //圖,可以這樣認為:圖的任意兩個頂點之間都有邊,兩頂點無法到達的,可以認為他們之間的邊權是

小生成樹 Prime演算法

問題背景: 對於一個圖,它的所有生成樹中必有一個“邊的權值最小”的生成樹,我們把它稱為最小生成樹。 概念很抽象,換做實際問題: 有十個城市,各個城市之間距離或遠或近。需要建設一個道路網,把十個城市連線在一起,要求道路網的道路長度最小。 各個城市的連線可以抽象為一個圖,本質上

小生成樹-prime演算法

Prime演算法的核心步驟是:在帶權連通圖中V是包含所有頂點的集合, U已經在最小生成樹中的節點,從圖中任意某一頂點v開始,此時集合U={v},重複執行下述操作:在所有u∈U,w∈V-U的邊(u,w)∈E中找到一條權值最小的邊,將(u,w)這條邊加入到已找到邊的集合,並且將點

小生成樹 prime演算法 求權值大的邊

Out of Hay Description The cows have run out of hay, a horrible event that must be remedied immediately. Bessie intends to visit the ot

小生成樹prim演算法模板

prim演算法適合稠密圖,即邊數較多而點較少的情況,時間複雜度為O(n2)O(n2),堆優化的情況下,如果點數為m,邊數為n,可以達到O(nlogm)O(nlogm).思想很簡單,就是每次尋找一條由已加入集合的點和與它們相鄰的沒加入集合的點的權值最小邊,進行n-

模板--小生成樹 Kruskal 演算法不詳解

最小生成樹   是由n個節點的連通圖變化來的。這棵樹滿足如下條件:     1、是原來圖的子圖(原來的圖扣去了幾條邊)     2、在保證圖仍然連通的情況下,剩下的邊權和是最小的     3、滿足樹的性質   最小生成樹常用來解決這樣的問題:     有n個村莊,他們之間本沒有路(走的人多了就有路了)。我們現

小生成樹(prim演算法與kruskal演算法)(模板)

th寫的總結,很不錯,轉載一下:點選開啟連結 首先說一下什麼是樹:     1、只含一個根節點     2、任意兩個節點之間只能有一條或者沒有線相連     3、任意兩個節點之間都可以通過別的節點間接相連     4、除了根節點沒一個節點都只有唯一的一個父節點

小生成樹-Kruskal演算法模板

Kruskal基本演算法:每次選取最短的邊,看該邊相連的兩點是否在同一集合內,若在,則跳過,若不在,就把兩個點合併,判斷與合併都用並查集實現。 Kruskal的複雜度是O(ElogE),適合稀疏圖。

1251 Jungle Roads 小生成樹Kruskal演算法模板

Kruskal演算法比Prim更好寫#include<iostream> #include<cstdio> #include<algorithm> #define

hdu1875(小生成樹prime

開始 缺陷 rim math.h turn cstring log urn else 思路:一開始想用貪心來著,發現貪心有缺陷,然後就用了最小生成樹來寫,這裏用了prime算法,首先,先建個圖,兩點之間的邊的權值就是兩個點的距離,然後直接prime模板 代碼 #inclu

POJ - 2485(小生成樹.prime)

contain include ios -- you mem sys ann ssi 題目鏈接: http://poj.org/problem?id=2485 題目: Highways Time Limit: 1000MS Memory Li

圖的小生成樹Kruskal演算法

克魯斯卡爾(Kruskal)演算法(只與邊相關) 演算法描述:克魯斯卡爾演算法需要對圖的邊進行訪問,所以克魯斯卡爾演算法的時間複雜度只和邊又關係,可以證明其時間複雜度為O(eloge)。 演算法過程: 1.將圖各邊按照權值進行升序排序 2.將圖遍歷一次,找出權值最小的邊,(條件

圖的小生成樹prim演算法詳解

prim演算法是求圖的最小生成樹的一種演算法,它是根據圖中的節點來進行求解,具體思想大概如下: 首先,將圖的所有節點(我們假定總共有n個節點)分成兩個集合,V和U。其中,集合V儲存的是我們已經訪問過的節點,集合U儲存的是我們未曾訪問的節點。prim演算法第一步就是選定第一個節點放入集合

小生成樹-kruskal演算法(非並查集的實現&優先佇列的sh xian&並查集的實現)

kruskal演算法:構造一個只含n個頂點,而邊集為空的子圖,若將該子圖中各個頂點看成是各棵樹的根節點,則它是一個含有n棵樹的森林 。之後,從網的邊集中選取一條權值最小的邊,若該邊的兩個頂點分屬不同的樹 ,則將其加入子圖,也就是這兩個頂點分別所在的 兩棵樹合成一棵樹;反之,若該邊的兩個頂點已落在同一

poj2075 小生成樹(Kruskal模板

Description You are the owner of SmallCableCo and have purchased the franchise rights for a small town. Unfortunately, you lack enough funds to star

小生成樹 - Kruskal演算法

Kruskal演算法 第二種最小生成樹演算法 —— Kruskal演算法 按照邊的權重順序(從小到大)處理它們,將邊加入最小生成樹中,加入的邊不會與已經加入的邊構成環,直到樹中含有 V

【資料結構】小生成樹 Prim演算法 Kruskal演算法

  選定一個開始的結點,在一個點集合中,其餘點在另一個點集合中,然後找取與這個結點相連的權值最小最小的邊,加入第一個點集合,之後再次找尋與這兩個節點相鄰的權值最小的邊加入,迴圈往復,直到所有的點都存在於第一個點集合中。 注意在選擇權值最小的邊時,不能夠形成迴路!!!! 不然