小hi的學校總共有n名學生,編號1-n。學校剛剛進行了一場全校的古詩文水平測驗。
學校沒有公布測驗的成績,所以小hi只能得到一些小道訊息,例如x號同學的分數比y號同學的分數高s分。
小hi想知道利用這些訊息,能不能判斷出某兩位同學之間的分數高低?
input
第一行包含三個整數n, m和q。n表示學生總數,m表示小hi知道訊息的總數,q表示小hi想詢問的數量。
以下m行每行三個整數,x, y和s。表示x號同學的分數比y號同學的分數高s分。
以下q行每行兩個整數,x和y。表示小hi想知道x號同學的分數比y號同學的分數高幾分。
對於50%的資料,1 <= n, m, q <= 1000
對於100%的資料,1 <= n, m, q<= 100000 1 <= x, y <= n -1000 <= s <= 1000
資料保證沒有矛盾。
output
對於每個詢問,如果不能判斷出x比y高幾分輸出-1。否則輸出x比y高的分數。
sample input
10 5 3
1 2 10
2 3 10
4 5 -10
5 6 -10
2 5 10
1 10
1 5
3 5
sample output
-1
20
0
分析:限時10s,但是點數達到10w,所以嘗試dfs失敗了。按學長教育使用帶權並查集,首次接觸,學習一下。
帶權並查集:基本的不變,依然是乙個快速找到集合歸屬的資料結構。find函式每次更新自己屬於的集合的根節點。不同的是,用乙個w陣列儲存與根節點路徑上的權值之和。所以每次更新的時候要更新到根節點權值和。union函式將兩個不同的集合合併,如果沒有權值,find函式即可以完成合併,這裡每次採用向量的計算方法將兩個集合的根節點路徑計算出來並且儲存在w陣列中,即w[a] = s +w[x] - w[x];
草圖。。。。。。。
小細節:查詢的時候有可能有部分點的w還沒有更新,需要再次find更新一次才會是正確的w。
#include #include #include #include using namespace std;
const int maxn = 100000+5;
const int inf = 0x7fffffff;
int n,m,q;
int u[maxn];
int w[maxn];
int finds(int x)
void unions(int x,int y,int s)
int main()
int uu,vv;
for(int i=0;i
else}}
return 0;
}
hihocoder 1515 分數調查
時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 小hi的學校總共有n名學生,編號1 n。學校剛剛進行了一場全校的古詩文水平測驗。學校沒有公布測驗的成績,所以小hi只能得到一些小道訊息,例如x號同學的分數比y號同學的分數高s分。小hi想知道利用這些訊息,能不能判斷出某兩位同學...
分數調查 HihoCoder 1515
小hi的學校總共有n名學生,編號1 n。學校剛剛進行了一場全校的古詩文水平測驗。學校沒有公布測驗的成績,所以小hi只能得到一些小道訊息,例如x號同學的分數比y號同學的分數高s分。小hi想知道利用這些訊息,能不能判斷出某兩位同學之間的分數高低?input 第一行包含三個整數n,m和q。n表示學生總數,...
HihoCoder 1515 帶權並查集
小hi的學校總共有n名學生,編號1 n。學校剛剛進行了一場全校的古詩文水平測驗。學校沒有公布測驗的成績,所以小hi只能得到一些小道訊息,例如x號同學的分數比y號同學的分數高s分。小hi想知道利用這些訊息,能不能判斷出某兩位同學之間的分數高低?input 第一行包含三個整數n,m和q。n表示學生總數,...