1. 程式人生 > >hiho 1515 : 分數調查 簡單bfs

hiho 1515 : 分數調查 簡單bfs

內存 數據 開始 amp alt () 消息 splay pri

時間限制: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

開始以為是存在環(矛盾的分數),這樣的話,可能要判環。讀完題發現沒有矛盾存在,這樣的話並查集+bfs亂搞

技術分享
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<memory>
using namespace std;
const int maxn=200010;
int Laxt[maxn],Next[maxn],To[maxn],V[maxn],cnt=0;
int fa[maxn],scr[maxn];//fa是分組,score代表相對分數。
void _add(int u,int v,int s){ Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v; V[cnt]=s; } void _dfs(int u){ for(int i=Laxt[u];i;i=Next[i]){ if(!fa[To[i]]){ fa[To[i]]=fa[u]; scr[To[i]]=scr[u]-V[i]; _dfs(To[i]); } } } int main() { int n,m,q,i,x,y,s; scanf("%d%d%d",&n,&m,&q); for(i=1;i<=m;i++){ scanf("%d%d%d",&x,&y,&s); _add(x,y,s); _add(y,x,-s); } for(i=1;i<=n;i++) if(!fa[i]){ fa[i]=i; _dfs(i); } for(i=1;i<=q;i++){ scanf("%d%d",&x,&y); if(fa[x]!=fa[y]) printf("-1\n"); else printf("%d\n",scr[x]-scr[y]); } return 0; }
View Code

hiho 1515 : 分數調查 簡單bfs