人活著系列之尋找最完美的人生
time limit: 1000ms memory limit: 65536kb
problem description
也許,人活著就是要嘗試人世間的酸甜苦辣,喜怒哀樂,經歷從嬰兒到老人的乙個過程吧!能看,能想,能愛,能恨,這就是活人與死人的區別。不要想著死後會怎樣,誰也不知道。所以要好好的活著,寬待自己,好好珍惜身邊的人!input現在,上帝之手寬恕與你。把你人生中所要經歷的所有的酸甜苦辣全部擺在你的面前。你一生需要經歷n種事情。每種事情都有乙個權值x。上帝給了你n-1個時光隧道。你可以把時光隧道放在任意兩種事情的中間,如果你把時光隧道放在a,b中間,那麼你需要花費3*(xa+xb)+7 。現在,你需要把這n-1個時光隧道連在n種事情中間,使得任意兩種事情都會相連,並且花費最小。輸出最小花費。
首先輸入乙個數t,代表有t組資料。output接下來一行輸入乙個數n。
接下來的一行輸入n個數,第i個數代表第i種事情的權值。
n<=1000,每種事情的權值<=100000;
t<=60
輸出t行,每行輸出最小花費。example input
1example output prim演算法本來已經忘了,結果遇見了這道題,kruskal被卡了。2 1 2
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 ...