Vijos P1045Kerry 的電纜網路

2021-07-04 17:14:22 字數 3075 閱讀 4227

描述

kerry 是德國的一位電纜商人。因聯合國脫貧計畫的邀請,他準備負責在土魯齊亞埃薩亞克斯烏托斯邦建立電纜網路,以滿足這個國家的用電需求。當然,現在土魯齊亞埃薩亞克斯烏托斯邦沒有任何電纜。已知土魯齊亞埃薩亞克斯烏托斯邦一共有n個城鎮,已經編號為1到n。其中任意兩個城鎮可能有一條路,也可能沒有。如果兩個城鎮之間有一條路pi,那麼這條路有乙個長度si,則kerry可以在這兩個城市之間建立一條電纜線,電纜線的長度也就是這條路的長度si。

現在kerry準備了s長的電纜線,電纜線可以任意拆斷,拆斷不損失任何電纜線。他需要將土魯齊亞埃薩亞克斯烏托斯邦所有城鎮都能夠連入這個電纜網路。那麼,kenny能不能使用這s長度的電纜線完成這項工作;如果能夠完成,那麼kerry最少耗用多少長度的電纜線呢?

格式 輸入格式

第一行乙個正實數s;

第二行乙個正整數n;

接下來一共有m行,第i行有兩個整數xi,yi和乙個實數si,表示編號為xi個村莊和編號為yi個村莊之間有一條路,路的長度為si。

輸入保證xi不等於yi,兩個城鎮之間不會有兩條路。

輸出格式

若能夠完成(建立這樣的電纜網路),則輸出(其中代表最少的電纜線長度,保留兩位小數):

need miles of cable

否則輸出:

impossible

樣例1

樣例輸入1

100.0

4 1 2 2.0

1 3 4.2

1 4 6.7

3 4 4.0

2 4 10.0

樣例輸出1

need 10.20 miles of cable

限制 各個測試點3s

提示 1<=n,m<=100000

對於該題很顯然是乙個純粹的最小生成樹的題目,只要對其進行一遍kruscal即可通過,同時記錄加入了多少條邊,若加的邊數等於節點數-1則說明所有的頂點都已聯通,否則輸出impossible。

program p1045;

type rec=record

s,e:longint;

v:real;

end;

var n,m,sum:longint;

len,cost:real;

map:array[1..100000] of rec;

i,j,k:longint;

father:array[1..100000] of longint;

rank:array[1..100000] of longint;

procedure

qsort

(i,j:longint);

var l,r:longint;

mid:real;

temp:rec;

begin

l:=i;

r:=j;

mid:=map[(l+r)>>1].v;

while l<=r do

begin

while map[l].vdo inc(l);

while map[r].v>mid do dec(r);

if l<=r then

begin

temp:=map[l];

map[l]:=map[r];

map[r]:=temp;

inc(l);

dec(r);

end;

end;

if lthen qsort(l,j);

if ithen qsort(i,r);

end;

function

find

(x:longint):longint;

begin

if father[x]=x

then

exit(x);

father[x]:=find(father[x]);

exit(father[x]);

end;

procedure

unite

(a,b:longint);

var fa,fb:longint;

begin

fa:=find(father[a]);

fb:=find(father[b]);

if rank[fa]>rank[fb]

then

father[fb]:=fa

else

father[fa]:=fb;

end;

begin

readln(len);

readln(n);

m:=0;

while

not eof do

begin

inc(m);

with map[m] do

readln(s,e,v);

end;

qsort(1,m);

for i:=1

to m do

begin

father[i]:=i;

rank[i]:=1;

end;

for i:=1

to m do

begin

if find(map[i].s)<>find(map[i].e)

then

begin

unite(map[i].s,map[i].e);

inc(sum);

cost:=cost+map[i].v;

end;

end;

if (cost>len) or (sum<>(n-1))

then

write('impossible')

else

write('need ',cost:0:2,' miles of cable');

end.

vijos p1045

乙個人總要走陌生的路,看陌生的風景,聽陌生的歌,然後在某個不經意的瞬間,你會發現,原本是費盡心機想要忘記的事情真的就那麼忘記了。

或許忘記了卻會更加珍惜過往失去的一切,只希望珍惜現在以及把握未來。

我會永遠珍惜過往的一切。即使已經回不過去過往,即使腳步阻擋不了時光的流逝!

10 4 訪客名單

編寫乙個while迴圈,提示使用者輸入其名字。使用者輸入其名字後,在螢幕上列印一句問候語,並將一條訪問記錄新增到檔案guest book.txt中。確保這個檔案中的每條記錄都獨佔一行。with open e guest book.txt w as f while true message input...

104 貨倉選址

把a 1 a n 排序,設貨倉建在 x 座標處,x 左側的商店有 p 家,右側的商店有 q 家。若 p q 則把貨倉的選址向右移動 1 單位距離,距離之和就會減小 q p。同理,若 p q 則貨倉的位置想左移動會使距離之和變小。當 p q 時為最優解。因此貨倉應該建在中位數處,即把 a 排序後,當 ...

10 4每日部落格

首先是將資料匯入到hive資料庫中,我使用的是以下的方法 將乙個csv或txt匯入hive 先修改格式為txt 第一行資料為列名,根據列名在hive建表 create table watermelon id string,color string,root string,stroke string,...