hiho 1515 : 分數調查 簡單bfs
阿新 • • 發佈:2017-10-27
內存 數據 開始 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