关闭

BZOJ4690 Never Wait for Weights

382人阅读 评论(0) 收藏 举报
分类:

第一反应是LCT什么鬼……我是不是没救了

然后看了一眼AC代码长度,瞬间发现自己是傻逼……

拿带权并查集维护就行了,每个点维护一下自己比自己的爹青多少,连边和路径压缩的时候更新一下即可

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<map>
#include<set>
#include<bitset>
#include<queue>
#include<stack>
using namespace std;
#define MAXN 100010
#define MAXM 1010
#define INF 1000000000
#define MOD 1000000007
#define eps 1e-8
#define ll long long
int n,m;
int f[MAXN],v[MAXN];;
int fa(int x){
	if(f[x]==x){
		return x;
	}
	int F=fa(f[x]);
	v[x]+=v[f[x]];
	f[x]=F;
	return f[x];
}
int main(){
	int i,x,y,z;
	char o[2];
	while(scanf("%d%d",&n,&m)){
		if(!n&&!m){
			break;
		}
		for(i=1;i<=n;i++){
			f[i]=i;
			v[i]=0;
		}
		while(m--){
			scanf("%s%d%d",o,&x,&y);
			if(o[0]=='!'){
				scanf("%d",&z);
				if(fa(x)!=fa(y)){
					int fx=f[x];
					f[fx]=f[y];
					v[fx]=v[y]+z-v[x];
				}
			}
			if(o[0]=='?'){
				if(fa(x)!=fa(y)){
					printf("UNKNOWN\n");
				}else{
					printf("%d\n",v[x]-v[y]);
				}
			}
		}
	}
	return 0;
}

/*
2 2
! 1 2 1
? 1 2
2 2
! 1 2 1
? 2 1
4 7
! 1 2 100
? 2 3
! 2 3 100
? 2 3
? 1 3
! 4 3 150
? 4 1
0 0 
*/


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:161210次
    • 积分:5580
    • 等级:
    • 排名:第4716名
    • 原创:400篇
    • 转载:0篇
    • 译文:1篇
    • 评论:82条
    最新评论