题意:
一共有n个物品;输入:? a b w 表示b比a重w,! a b 表示输出b比a重多少;
思路:
对每个? a b w;建立a、b的并查集,维护dis数组。dis[x]表示x比x的父亲fa[x]重多少;
代码:
#include <bits/stdc++.h>
using namespace std;
int fa[100100];
long long dis[100100];
int n,m;
int fi(int x)
{
if(fa[x]==x)
return x;
int root = fi(fa[x]);
dis[x] += dis[fa[x]];
fa[x] = root;
return root;
}
void uni(int x,int y,int d)
{
int fx = fi(x);
int fy = fi(y);
if(fx!=fy)
{
fa[fy] = fx;
dis[fy] = dis[x]-dis[y]+d;
}
}
int main()
{
while(~scanf("%d%d",&n,&m)&&(n!=0||m!=0))
{
memset(dis,0,sizeof(dis));
for(int i = 0;i<=n;i++)
fa[i] = i;
while(m--)
{
char s[5],op;
int a,b,w;
scanf("%s",s);
op = s[0];
if(op=='!')
{
scanf("%d%d%d",&a,&b,&w);
uni(a,b,w);
}
else
{
scanf("%d%d",&a,&b);
if (fi(a)!=fi(b))
printf("UNKNOWN\n");
else
printf("%d\n",dis[b]-dis[a]);
}
}
}
return 0;
}