nyoj38佈線問題兩種演算法詳解

2021-08-18 11:23:32 字數 2110 閱讀 3335

時間限制:

1000

ms  |           記憶體限制:

65535

kb難度:

4描述

南陽理工學院要進行用電線路改造,現在校長要求設計師設計出一種佈線方式,該佈線方式需要滿足以下條件:

1、把所有的樓都供上電。

2、所用電線花費最少

輸入

第一行是乙個整數n表示有n組測試資料。(n<5)

每組測試資料的第一行是兩個整數v,e.

v表示學校裡樓的總個數(v<=500)

隨後的e行裡,每行有三個整數a,b,c表示a與b之間如果建鋪設線路花費為c(c<=100)。(哪兩棟樓間如果沒有指明花費,則表示這兩棟樓直接連通需要費用太大或者不可能連通)

隨後的1行裡,有v個整數,其中第i個數表示從第i號樓接線到外界供電設施所需要的費用。( 0

(樓的編號從1開始),由於安全問題,只能選擇乙個樓連線到外界供電裝置。

資料保證至少存在一種方案滿足要求。

輸出

每組測試資料輸出乙個正整數,表示鋪設滿足校長要求的線路的最小花費。

樣例輸入

14 6

1 2 10

2 3 10

3 1 10

1 4 1

2 4 1

3 4 1

1 3 5 6

樣例輸出

4

prim演算法:

#include#include#include#define inf 0x3f3f3f  

#define max 500+10

using namespace std;

bool cmp(int x,int y) //利用sort函式來將城市需要外接電路花費排序

} mincost+=min;

visit[next]=1;

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

} }

return mincost;

}

int main()

for(i=0;ikruskal演算法:

#include#include#define max 200000+10

using namespace std;

int set[550],contact[550]; //set : 記錄每個點的根結點

struct line

num[max];

bool cmp(line a,line b) //以花費大小從小到大將每一組聯絡排列

visit[1]=1; //設定1為起點

for (i=2;i<=num;i++)

}mincost+=min; //最小權值累加

visit[next]=1; //將訪問過的點標記

for(j=1;j<=num;j++) //更新lowcost陣列

} } return mincost;

}

//kruskal 演算法核心**

#include#define maxx x //x為 範圍

int set[maxx]; //set為 頭結點陣列

struct line //設定結構體

num[maxx];

bool cmp(line a,line b) //設定比較函式

int find(int p) //並查集

return p;

}void merge(int x,int y)

int main() //主函式

sort(num,num+road,cmp); //排序

for(i=1;i<=school;i++) //初始化頭結點陣列

int need=0;

for(i=0;iprintf("%d\n",need);

}

nyoj 38 佈線問題

nyoj 38 佈線問題 時間限制 1000 ms 記憶體限制 65535 kb難度 4 描述 南陽理工學院要進行用電線路改造,現在校長要求設計師設計出一種佈線方式,該佈線方式需要滿足以下條件 1 把所有的樓都供上電。2 所用電線花費最少 輸入第一行是乙個整數n表示有n組測試資料。n 5 每組測試資...

佈線問題 nyoj38

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 南陽理工學院要進行用電線路改造,現在校長要求設計師設計出一種佈線方式,該佈線方式需要滿足以下條件 1 把所有的樓都供上電。2 所用電線花費最少 輸入第一行是乙個整數n表示有n組測試資料。n 5 每組測試資料的第一行是兩個整數v,...

NYOJ 38 佈線問題

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 南陽理工學院要進行用電線路改造,現在校長要求設計師設計出一種佈線方式,該佈線方式需要滿足以下條件 1 把所有的樓都供上電。2 所用電線花費最少 輸入第一行是乙個整數n表示有n組測試資料。n 5 每組測試資料的第一行是兩個整數v,...