一个小问题,这道题为什么没人用map做?感觉根本不用离散化,map就过了
查看原帖
一个小问题,这道题为什么没人用map做?感觉根本不用离散化,map就过了
380599
hz1z_zephinue楼主2021/7/27 15:36
#include <bits/stdc++.h>

using namespace std;

int T, n;
int fa[2000005];
int fr[1000005], to[1000005], type[1000005];
map<int, int> mp; int cnt;

inline int find(int cur){
	if(fa[cur] == cur) return cur;
	else return fa[cur] = find(fa[cur]);
}

int main(){
	scanf("%d", &T);
	while(T--){
		cnt = 0;
		map<int, int> empty; mp = empty;
		memset(fa, 0, sizeof(fa));
		scanf("%d", &n);
		for(int i=1; i<=n; i++){
			scanf("%d%d%d", &fr[i], &to[i], &type[i]);
			if(!mp[fr[i]]) mp[fr[i]] = ++cnt; 
			if(!mp[to[i]]) mp[to[i]] = ++cnt;
		}
		for(int i=1; i<=cnt; i++) fa[i] = i;
		int flag = 1;
		for(int i=1; i<=n; i++){
			if(type[i] == 1){
				int fx = find(mp[fr[i]]), fy = find(mp[to[i]]);
				if(fx != fy){
					fa[fx] = fy;
				}
			}
		}
		for(int i=1; i<=n; i++){
			if(type[i] == 0){
				int fx = find(mp[fr[i]]), fy = find(mp[to[i]]);
				if(fx == fy){
					flag = 0; break;
				}
			}
		}
		if(flag == 1) printf("YES\n");
		else printf("NO\n");
	}
}

如上代码,时间大概最大的点900ms

2021/7/27 15:36
加载中...