1. 程式人生 > >【[Offer收割]程式設計練習賽15-B分數調查】

【[Offer收割]程式設計練習賽15-B分數調查】

【連結】https://hihocoder.com/contest/offers15/problems
【題目描述】
題目2 : 分數調查
時間限制:10000ms
單點時限:1000ms
記憶體限制:256MB
描述
小Hi的學校總共有N名學生,編號1-N。學校剛剛進行了一場全校的古詩文水平測驗。

學校沒有公佈測驗的成績,所以小Hi只能得到一些小道訊息,例如X號同學的分數比Y號同學的分數高S分。

小Hi想知道利用這些訊息,能不能判斷出某兩位同學之間的分數高低?

輸入
第一行包含三個整數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

資料保證沒有矛盾。

輸出
對於每個詢問,如果不能判斷出X比Y高几分輸出-1。否則輸出X比Y高的分數。

樣例輸入
10 5 3
1 2 10
2 3 10
4 5 -10
5 6 -10
2 5 10
1 10
1 5
3 5
樣例輸出
-1
20
0
【思路】:腦殘+手殘,其實最後都快寫出來了,就差那麼一點點,好吧,其實已經好久沒刷題了,腦袋思維+手速熟練度明顯下降!明顯的帶權並查集操作,程式碼如下:

/***********************
[Offer收割]程式設計練習賽15     【B分數調查】
Author:herongwei
Time:2017/4/23 14:00
language:C++
http://blog.csdn.net/u013050857
***********************/
#pragma comment(linker,"/STACK:102400000,102400000")
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <set>
#include <stack> #include <math.h> #include <map> #include <queue> #include <deque> #include <vector> #include <algorithm> using namespace std; typedef long long LL; const int maxn = 1e5+10; const LL MOD = 999999997; const int inf= 0x3f3f3f3f; int dir4[4][2]= {{1,0},{0,1},{-1,0},{0,-1}}; int dir8[8][2]= {{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}}; /*Super waigua */ #define INLINE __attribute__((optimize("O3"))) inline INLINE char NC(void) { static char buf[100000], *p1 = buf, *p2 = buf; if (p1 == p2) { p2 = (p1 = buf) + fread(buf, 1, 100000, stdin); if (p1 == p2) return EOF; } return *p1++; } INLINE void read(int &x) { static char c; c = NC(); int b = 1; for (x = 0; !(c >= '0' && c <= '9'); c = NC()) if(c == '-') b = -b; for (; c >= '0' && c <= '9'; x = x * 10 + c - '0', c = NC()); x *= b; } int fa[maxn],fen[maxn],vis[maxn]; void init() { for(int i=1; i<=maxn; ++i) fa[i]=i, fen[i]=0; } /*find the father!!!!!*/ int find(int x) { if(x==fa[x]) return x; else { int root = find( fa[x] ); fen[x] += fen[fa[x]]; return fa[x] = root; } } /*Union!!!!!!!*/ int Union(int x,int y,int s) { int fx=find(x); int fy=find(y); if(fx!=fy) { fen[fy]=fen[x]+s-fen[y]; fa[fy]=fx; } } int main() { //freopen("in.txt","r",stdin); int n,m,l; while(~scanf("%d %d %d",&n,&m,&l)) { init(); int x,y,s; for(int i=1; i<=m; ++i) { read(x); read(y); read(s); Union(x,y,s); } for(int i=1; i<=l; ++i) { read(x); read(y); if(find(x)!=find(y))puts("-1"); else printf("%d\n",fen[y]-fen[x]); } } return 0; }