wikioi 4246(带权并查集)

题目描述 Description

   奶牛们在FJ的养育下茁壮成长。这天,FJ给了奶牛Bessie一个任务,去看看每个奶牛场中若干只奶牛的身高,由于Bessie是只奶牛,无法直接看出第i只奶牛的身高,而只能看出第i只奶牛与第j只奶牛的身高差,其中第i 只奶牛与第j只奶牛的身高差为A(i<=n)。当A大于0时表示这只奶牛比前一只奶牛高A cm,小于0时则是低。现在,FJ让Bessie总共去看了m次身高,当然也就传回给FJ m对奶牛的身高差,但是Bessie毕竟是奶牛,有时候眼睛可能会不好使……(大雾)你的任务是帮助FJ来判断是不是需要给Bessie看看眼睛了……

注:Hj-Hi=A 注意T1的样例 注意注意注意 重要的事情说三遍。

输入描述 Input Description

第一行为一个正整数w,表示有w组数据,即w个奶牛场,需要你判断。每组数据的第一行为两个正整数n和m,分别表示对应的奶牛场中的奶牛只数以及看了多少个对奶牛身高差。接下来的m行表示Bessie看m次后传回给FJ的m条信息,每条信息占一行,有三个整数s,t和v,表示第s只奶牛与第t只奶牛的身高差为v。


输出描述 Output Description

包含w行,每行是”Bessie’s eyes are good”或”Bessie is blind.”(不含双引号),其中第i行为”Bessie’s eyes are good”当且仅当第i组数据,即无法从第i个奶牛场传回的身高差判断Bessie视力好不好;第i行为”Bessie is blind.”当且仅当第i组数据,即从第i个奶牛场传回的身高差是有问题的。


样例输入 Sample Input

2

3 3

1 3 10

2 3 5

1 2 5

4 3

1 4 100

3 4 50

1 3 100


样例输出 Sample Output

Bessie’s eyes are good

Bessie is blind.


数据范围及提示 Data Size & Hint

对于30%的数据,保证n<=100,m<=1000;

对于100%的数据,保证w<=100,n<=1000,m<=30000,|A|<=30000.


解题思路:复习题。。。


#include
#include
#include
#include
using namespace std;
int w;
int n,m;
int fa[10000];
int dis[10000];


int find(int o)
 {
  int u=fa[o];
  if (fa[o]!=o) fa[o]=find(fa[o]);
  dis[o]+=dis[u];
  return fa[o];
 }


inline int read()
{
char y; int x=0,f=1; y=getchar();
while (y<'0'||y>'9'){if (y=='-') f=-1; y=getchar();}
while (y>='0'&&y<='9') {x=x*10+int(y)-48; y=getchar();}
return x*f;
}


int main()
{
w=read();
for (int yg=1;yg<=w;++yg)
{
n=read(); m=read();
bool mg=true;
for (int i=1;i<=n;++i)
{
fa[i]=i; dis[i]=0;
 }
for (int i=1;i<=m;++i)
{
int x,y,c;
x=read(); y=read(); c=read();
if (mg==false)continue;
int u1=find(x); int u2=find(y);
if (u1!=u2)
{
   fa[u1]=u2; dis[u1]=dis[y]+c-dis[x];
 }else
  {
  if (dis[x]-dis[y]!=c) mg=false;
  }
}
printf ( mg ? "Bessie's eyes are good\n" : "Bessie is blind.\n");
}
}

你可能感兴趣的:(并查集,wikioi)