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)
30 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臺計算機,為了方便資料傳輸,現要將它們用資料線連線起來。兩台計算機被連線是指它們間有資料線連線。由於計算機所處的位置不同,因此不同的兩台計算機的連線費用往往是不同的。當然,如果將任意兩台計算機都用資料線連線,費用將是相當龐大的。為了節省費用,我們採用資料的間接傳輸手段,即一台計算機...