最小生成樹prim

2021-08-15 07:20:52 字數 1830 閱讀 3554

人活著系列之尋找最完美的人生
time limit: 1000ms memory limit: 65536kb

problem description

也許,人活著就是要嘗試人世間的酸甜苦辣,喜怒哀樂,經歷從嬰兒到老人的乙個過程吧!能看,能想,能愛,能恨,這就是活人與死人的區別。不要想著死後會怎樣,誰也不知道。所以要好好的活著,寬待自己,好好珍惜身邊的人!

現在,上帝之手寬恕與你。把你人生中所要經歷的所有的酸甜苦辣全部擺在你的面前。你一生需要經歷n種事情。每種事情都有乙個權值x。上帝給了你n-1個時光隧道。你可以把時光隧道放在任意兩種事情的中間,如果你把時光隧道放在a,b中間,那麼你需要花費3*(xa+xb)+7 。現在,你需要把這n-1個時光隧道連在n種事情中間,使得任意兩種事情都會相連,並且花費最小。輸出最小花費。

input

首先輸入乙個數t,代表有t組資料。

接下來一行輸入乙個數n。

接下來的一行輸入n個數,第i個數代表第i種事情的權值。

n<=1000,每種事情的權值<=100000;

t<=60

output

輸出t行,每行輸出最小花費。

example input

1

2 1 2

example output

prim演算法本來已經忘了,結果遇見了這道題,kruskal被卡了。

kruskal的時間複雜度大致為mlogm,m為邊數,瓶頸在sort排序。

prim的時間複雜度(無優化)為n^2,n為點數。

即prim稠密圖較優,kruskal稀疏圖較優。

prim思路

選乙個點初始進入聯通塊,並更新所有點進入聯通塊的最小花費

for(i = 1;i < n;i ++)

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

int i,j,n,t;

long

long cost;

bool flag[1100];

int dis[1100][1100],indis[1100],v[1100];

void prim()

for(i = 1;i < n;i ++)}}

flag[mark] = 1; //進入聯通塊

cost += minn;

for(j = 1;j <= n;j ++) // 更新

indis[j] = min(indis[j],dis[mark][j]);

}}int main()

for(i = 1;i <= n;i ++)

for(j = 1;j <= n;j ++)

dis[i][j] = 3*(v[i]+v[j])+7;

cost = 0;

prim();

cout

0;}

最小生成樹 Prim

include stdio.h include stdlib.h include io.h include math.h include time.h define ok 1 define error 0 define true 1 define false 0 define maxedge 20 ...

最小生成樹 prim

演算法模型 由任意乙個頂點開始 將此頂點存入s集,剩餘頂點存入t集合 每次遍歷頂點,取一條能夠連線s與t最短邊e,直到所有頂點全部加入s include include define inf 1 30 int n,m,vis 110 low 110 int map 110 110 int init ...

最小生成樹 PRIM

這個是有關普利姆的演算法,從乙個點出發,找出與這個點相連的所有點的對應的權值最小的那個,然後再把這個點從集合中劃掉。模板如下 include include define inf 0xfffff define max 2005 using namespace std int map max max ...