题意:1~n个数,m个操作,!a b c的意思是第b个数减去第a个数等于c。
?a b的意思是问第b个数减去第a个数等于多少
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define ll long long
const int maxn = 1e6+100;
ll dis[maxn];
int fa[maxn];
int n,m;
void init(){
for(int i=1;i<=n;i++){
dis[i] = 0;
fa[i] = i;
}
}
int find(int x){
if(fa[x]!=x){
int tmp = find(fa[x]);
dis[x]+=dis[fa[x]];
fa[x] = tmp;
}
return fa[x];
}
int main(){
while(cin>>n>>m){
if(n==0&&m==0)break;
init();
char op[2];
int a,b,c;
while(m--){
scanf("%s",op);
if(op[0] == '!'){
scanf("%d%d%d",&a,&b,&c);
int f1 = find(a);
int f2 = find(b);
if(f1!=f2){
fa[f2] = f1;
dis[f2] = dis[a] - dis[b] + c;
}
}
else{
scanf("%d%d",&a,&b);
int f1 = find(a);
int f2 = find(b);
if(f1!=f2)cout<<"UNKNOWN"<<endl;
else cout<<dis[b] - dis[a]<<endl;
}
}
}
return 0;
}