9004 7010 最優佈線問題

2021-09-29 18:57:18 字數 1532 閱讀 3152

time limit: 1 second

memory limit: 256 mb

問題描述

學校有n臺計算機,為了方便資料傳輸,現要將他們用資料線連線起來。兩台計算機被連線起來是指他們之間有資料線相連。由於計

算機所處的位置不同,因此不同的兩台計算機的連線費用往往不同。

當然,如果將任意兩條計算機都用資料線連線起來,費用將是相當龐大的。為了節省費用,我們採用資料間接傳輸手段,機一台計算

機可以間接的通過若干臺計算機(作為中轉)來實現與另一台計算機的相連。

現在由你負責連線這些計算機,你的任務是是任意兩台計算機都聯通(不管是間接的或是直接的)。  

輸入檔名為wire.in,第一行為整數n(2<=n<=100),表示計算機數目。此後的n行,每行n個整數。第x+1行y列的整數表示直接連

接第x臺計算機和第y臺計算機的費用。

輸出檔名為wire.out,乙個整數,表示最小的連線費用。

(注:表示連1和2,2和3,費用為2) 

3

0 1 2

1 0 1

2 1 0

2
【題解】
這題是用來練最小生成樹的做法的。
我寫了注釋。演算法的實現原理,可以去找書自己看。
【**】
法一,克魯斯卡爾演算法
#include #include using namespace std;

struct edge

;edge a[10000];

int n,su,num,f[101],nn = 0;

void input_data()

}}int cmp(const edge & a,const edge &b) //這是對比函式 return 1表示要按照這樣順序排

int findfather(int x) //找根節點

void get_ans() //來累加邊

}}void output_ans()

int main()

法二,普里姆演算法
#include #include int next[10000],first[101],to[10000],num = 0,su,n,w[10000],dis[101],mi;

bool bo[101];

void input_data()

}}void get_ans()

if (k == -1) //如果沒找到就結束

break;

bo[k] = true; //記錄這個點加入mst

su += dis[k]; //累加和

int temp = first[k]; //檢視這個點的出度

while (temp!=0)

}}void output_ans()

int main()

最優佈線問題

time limit 1000ms memory limit 65536k 有疑問?點這裡 學校有n臺計算機,為了方便資料傳輸,現要將它們用資料線連線起來。兩台計算機被連線是指它們中間有資料線連線。由於計算機所處的位置不同,因此不同的兩台計算機的連線費用往往是不同的。當然,如果將任意兩台計算機都用資...

最優佈線問題

最優佈線問題 time limit 10000ms memory limit 65536k total submit 116 accepted 95 case time limit 1000ms description 學校有n臺計算機,為了方便資料傳輸,現要將它們用資料線連線起來。兩台計算機被連線...

最優佈線問題

問題描述 學校有n臺計算機,為了方便資料傳輸,現要將它們用資料線連線起來。兩台計算機被連線是指它們間有資料線連線。由於計算機所處的位置不同,因此不同的兩台計算機的連線費用往往是不同的。當然,如果將任意兩台計算機都用資料線連線,費用將是相當龐大的。為了節省費用,我們採用資料的間接傳輸手段,即一台計算機...