161114-練習-day1-ahsdfz t3
很久很久以前有乙個國家,這個國家有 n 個城市,城市由 1,2,3,…,,n 標號,城市間有 m 條雙向道路,每條道路都有兩個屬性 g 和 s ,兩個城市間可能有多條道路,並且可能存在將某一城市與其自身連線起來的道路。後來由於戰爭的原因,國王不得不下令減小花費從而關閉一些道路,但是必須要保證任意兩個城市相互可達。
道路花費的計算公式為 wg*max+ws*max,其中 wg 和 ws 是給定的值。國王想要在滿足連通性的前提下使這個花費最小,現在需要你計算出這個花費。
第一行包含兩個正整數 n 和 m 。
第二行包含兩個正整數 wg 和 ws 。
後面的 m 行每行描述一條道路,包含四個正整數 u,v,g,s,分別表示道路連線的兩個城市以及道路的兩個屬性。
輸出乙個整數,表示最小花費。若無論如何不能滿足連通性,輸出 -1 。
輸入 [複製]
3 3輸出2 1
1 2 10 15
1 2 4 20
1 3 5 1
30
【資料規模與約定】
對於 10% 的資料,n≤10;m≤20;
對於 30% 的資料,n≤100;m≤1000;
對於 50% 的資料,n≤200;m≤5000;
對於 100% 的資料,n≤400;m≤50000;wg,ws,g,s≤1000000000
30 分做法:
按照 g 屬性從小到大排序,列舉 maxg,對滿足 maxg 的所有道路
按照 s 屬性從小到大排序,然後做 kruskal,時間複雜度o(m^2logm)。
50 分做法:
在 30 分基礎上,發現每次只增加一條邊,插入到上次的邊集合中再做 kruskal 即可,時間複雜度 o(m^2)。
100 分做法:
依舊按照 g 屬性從小到大排序。丌斷加入新邊的過程中發現,當前的最小生成樹只可能是由未加入新邊的最小生成樹的邊和當前新邊組成的共 n 條邊中選出 n-1 條構成。因此維護乙個最小生成樹邊集,每次只在 n 條邊中做最小生成樹,時間複雜度 o(mn)。
#include#include#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int n=50001
;struct
node
ed[n];
int n,m,fa[401
];int sta[401
],tot,num;
long
long
wg,ws;
long
long ans=2e18+5
;inline
intri()
for(;c<='
9'&&c>='
0';c=getchar())
f=(f+(f<<2)<<1)+(c^'0'
);
return f*i;
}inline
long
long
rl()
for(;c<='
9'&&c>='
0';c=getchar())
f=(f+(f<<2)<<1)+(c^'0'
);
return f*i;
}inline
int getfa(int
x)inline
void comb(int x,int
y)bool
comp(node a,node b)
intmain()
sort(ed+1,ed+m+1
,comp);
tot=0;
intj;
for(int i=1;i<=m;i++)
tot++,sta[j+1]=i;
num=0
;
for(j=1;j<=tot;j++)
}if(num==n-1
) ans=min(ans,ed[sta[num]].s*ws+ed[i].g*wg);
tot=num;
} if(ans==2e18+5) cout<<"-1"
}
刷題總結 攔截飛彈(ssoj)
noip1999 提高組試題 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸...
筆試刷題總結
今天刷了一些筆試題,以下是刷完筆試題後看到的相關知識點的解析,做個小結。1 多型主要以兩種形式,靜態多型和動態多型,靜態多型主要實現了函式過載和運算子過載。動態多型主要實現了虛函式。虛函式是動態聯編,程式在執行的過程中確定呼叫哪乙個函式。2 int s 8 定義乙個指標陣列,該陣列中每個元素是乙個指...
Java刷題總結
public class hasstatic a.程式通過編譯,輸出結果為 x 102 b.程式通過編譯,輸出結果為 x 103 c.10行不能通過編譯.因為x星私有靜態變數 d.5行不能通過編譯.因為引用了私有靜態變數 解析 同乙個類內,private變數可以訪問,所以cd錯。由於x是static...