祭了
查看原帖
祭了
641163
abensyl楼主2023/11/25 21:59
#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
int cnt[N],res[N],n,m,q;
struct dsu {
	int fa[N];
	void init(int n) {
		for(int i=1;i<=n;++i) fa[i]=i;
	}
	int find(int x){
		if(fa[x]==x) return x;
		return fa[x]=find(fa[x]);
	}
	void merge(int x,int y) {
		x=find(x),y=find(y);
		if(x==y) return;
		fa[x]=y;
	}
} d;
vector<pair<int,int>> g[N];
vector<pair<int,int>> qr;
unordered_map<long long,int> mp;
void solve2(int cl) {
	for(auto c:g[cl])
		d.merge(c.first,c.second);
	for(int i=0;i<q;++i)
		if(d.find(qr[i].first)==d.find(qr[i].second))
			res[i]++;
	d.init(n);
}
long long hsh(long long x,long long y) {
	return x*1000000+y;
}
void solve1(int cl) {
	vector<int> zc;
	for(auto c:g[cl]) {
		zc.push_back(c.first);
		zc.push_back(c.second);
		d.merge(c.first,c.second);
	}
	sort(zc.begin(),zc.end());
	zc.erase(unique(zc.begin(),zc.end()),zc.end());
	for(auto x:zc) {
		for(auto y:zc) {
			if(d.find(x)!=d.find(y)) continue;
			if(mp.count(hsh(x,y)))
				res[mp[hsh(x,y)]]++;
		}
	}
	for(auto c:g[cl]) {
		d.fa[c.first]=c.first;
		d.fa[c.second]=c.second;
	}
}
signed main() {
	//freopen(".in", "r", stdin);
	//freopen(".out", "w", stdout);
	ios::sync_with_stdio(false);
	cin.tie(nullptr),
	cout.tie(nullptr);
	cin>>n>>m;
	int bz=sqrt(m)+1;
	d.init(n);
	for(int i=1;i<=m;++i) {
		int u,v,c;
		cin>>u>>v>>c;
		g[c].push_back(make_pair(u,v));
		cnt[c]++;
	}
	cin>>q;
	for(int i=1;i<=q;++i) {
		int u,v;
		cin>>u>>v;
		qr.push_back(make_pair(u,v));
		mp[hsh(u,v)]=i-1;
	}
	for(int i=1;i<=m;++i) {
		if(cnt[i]==0) continue;
		if(cnt[i]<=bz) solve1(i);
		else solve2(i);
	}
	for(int i=0;i<q;++i) cout<<res[i]<<'\n';
	return 0;
}
2023/11/25 21:59
加载中...