題目描述:
東東在老家農村無聊,想種田。農田有 n 塊,編號從 1~n。種田要灌氵
眾所周知東東是乙個魔法師,他可以消耗一定的 mp 在一塊田上施展魔法,使得黃河之水天上來。他也可以消耗一定的 mp 在兩塊田的渠上建立傳送門,使得這塊田引用那塊有水的田的水。 (1<=n<=3e2)
黃河之水天上來的消耗是 wi,i 是農田編號 (1<=wi<=1e5)
建立傳送門的消耗是 pij,i、j 是農田編號 (1<= pij <=1e5, pij = pji, pii =0)
東東為所有的田灌氵的最小消耗
輸入:第1行:乙個數n
第2行到第n+1行:數wi
第n+2行到第2n+1行:矩陣即pij矩陣
輸出:東東最小消耗的mp值
sample:
input45
4430 2 2 2
2 0 3 3
2 3 0 4
2 3 4 0
output
9題目分析:
本題如果沒有「黃河之水天上來」那就是乙個完美的最小生成樹問題,但是這裡可以用外來的力量灌水,所以我們把這個外來的力量看做乙個點,這個點與所有的點都聯通,恰好題目裡給的資料大小正好。
for
(i =
0;i < n; i++
)
這裡最小生成樹就是找所有最小的邊,只要不封閉就取出,這樣我們就需要乙個排序,當然可以operate過載,也可以利用sort自構函式解決
struct edge
e[200000];
bool
cmp(edge a,edge b)
本題為了方便,我們用鍊錶表示圖。剛好還有個問題,就是如何判斷是不是閉環,我們就用孩子雙親表示法來表示樹,加入乙個邊的時候看看他兩個點的雙親是不是一樣,一樣的話再加入這條邊就會出來乙個三角形,是封閉的,所以不能加入,反之就加入,這樣有利用到了並查集,把加入的點合併到乙個集合裡面去
int
find
(int x)
void
unite
(int x,
int y)if(
find
(e[j]
.u)!=
find
(e[j]
.v))
當然本題還有乙個小陷阱,就是它的輸入是陣列儲存矩陣,但是這個題是鍊錶儲存矩陣,而且這個是無向圖,也就是矩陣是對稱的,我們只需要一條邊,那麼怎麼辦?輸入的洪流是不可抗拒的,所以我們就先儲存好,然後只需要取上半部分或者下半部分就可以了(我本人忽視了這裡然後一直卡在test5不過,wa了十幾次,(┬_┬))
for
(int j =
1; j <= n; j++)}
for(
int j =
1; j <= n; j++)}
}
**如下:
#include
#include
using
namespace std;
struct edge
e[200000];
int m[
400]
[400];
//臨時儲存輸入的矩陣表示的圖
int father[
400]
;//記錄父親
int i;
//記錄圖的點
bool
cmp(edge a,edge b)
//比較
void
addedge
(int u,
int v,
int w)
//插入邊
intfind
(int x)
//查詢雙親
void
unite
(int x,
int y)
//結合
intmain()
for(i =
0;i < n; i++
)//對於「黃河之水天上來」的處理
for(
int j =
1; j <= n; j++
)//輸入矩陣表示
}for
(int j =
1; j <= n; j++
)//取一半插入邊}}
sort
(e, e + i , cmp)
;//排序
int num =0;
int sum =0;
for(
int j =
0; j < i; j++)if
(num == n)
} cout << sum;
}
第六周作業
a.用指標訪問物件 includeusing namespace std class a a int aa a aa 定義建構函式,用引數aa初始化資料成員a void display int main b.指標型別作為成員函式的引數 includeusing namespace std class...
第六周作業
1 自建yum倉庫,分別為網路源和本地源 本地源 cd etc yum.repos.d vim local.repo local name local cdrom yum baseurl file misc cd enabled 1 gpgcheck 1 gpgkey file etc pki rp...
第六周作業
1.簡述gps載波相位測量的基本原理?載波相位測量是利用接收機測定載波相位觀測值或其差分觀測值,經基線向量解算以獲得兩個同步觀測站之間的基線向量座標差的技術和方法。載波相位觀測量理論上是gps訊號在接收時刻的瞬時載波相位值。但實際上是無法直接測量出任何訊號的瞬時載波相位值,測量接收到的是具有都卜勒頻...