F-6187-Never Wait forWeights
题目分析
利用并查集来判断两个点之间是否可以有答案,此外用个数组记录该点到根的距离,而两点之间的距离就是g[a]-g[b]。
AC代码
#include <iostream>
using namespace std;
int fa[100001],g[100001];
int getfa(int a)
{
int tmp;
if (fa[a]==a) return a;
tmp=fa[a];
fa[a]=getfa(fa[a]);
g[a]=g[tmp]+g[a];
return fa[a];
}
int main()
{
int n,m,i,a,b,c,af,bf;
char q;
while (cin>>n>>m&&n!=0)
{
for (i=1; i<=n; i++)
{
fa[i]=i;
g[i]=0;
}
for (i=0; i<m; i++)
{
cin>>q;
if (q=='!'){
cin>>a>>b>>c;
af=getfa(a);
bf=getfa(b);
if (af!=bf){
fa[af]=bf;
g[af]=g[b]+c-g[a];
}
}
else {
cin>>a>>b;
af=getfa(a);
bf=getfa(b);
if (af!=bf)
cout<<"UNKNOWN"<<endl;
else cout<<g[a]-g[b]<<endl;
}
}
}
return 0;
}