MnZn求助,0pts
查看原帖
MnZn求助,0pts
299756
Surget楼主2021/1/18 22:09

已经调吐了,求dalao帮忙看看/kk

有一些调试所以看上去比较畸形(没有也畸形

#include<queue>
#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
vector<pair<int,int> > g[50012];
int z[10012];
int fa[10012][21],w[10012][21];
bool vis[10012];
int n,m,q,maxk=19,len=0;
int h[10012];
struct STR {
	int x,y,d;
}a[50012];
bool cmp(STR x,STR y) {
	return x.d>y.d;
}
int _find(int x) {
	if(x==z[x])return x;
	else return z[x]=_find(z[x]);
}
void add(int x,int y) {
	z[z[x]]=z[y];
}
void bfs() {
	queue<int> q;
	q.push(1);
	vis[1]=true;
	h[1]=0;
	while(!q.empty()) {
		int k=q.front();
		q.pop();
		for(int i=0; i<g[k].size(); i++) {
			int v=g[k][i].first;
			int d=g[k][i].second;
			if(!vis[v]) {
//				printf("\n%d %d %d\n",k,v,d);
//				printf("9999999 ");
				w[v][0]=d;
				fa[v][0]=k;
				h[v]=h[k]+1;
				vis[v]=true;
				q.push(v);
			}
		}
	}
//	puts("");
//	printf("%d %d %d",fa[1][1],fa[2][1],fa[3][1]);
//	for(int i=0;i<=maxk;i++){
//		for(int j=1;i<=n;i++){
//			printf("%d ",w[j][i]);
//		}
//		puts("");
//	}
	return ;
}
void ini() {
	for(int i=0; i<=maxk; i++) {
		for(int j=1; j<=n; j++) {
			fa[j][i]=fa[fa[j][i-1]][i-1];
			w[j][i]=min(w[j][i-1],w[fa[j][i-1]][i-1]);
		}
	}
//	for(int i=1; i<=maxk; i++) {
//		for(int j=1; j<=n; j++) {
//			printf("%d ",w[j][i]);
//		}
//		puts("");
//	}
//	printf("%d %d %d",fa[1][1],fa[2][1],fa[3][1]);
	return ;
}
int LCA(int x,int y) {
	if(_find(x)!=_find(y)) return -1;
	int ans=9999999;
//	printf("%d\n",ans);
	if(h[x]<h[y])swap(x,y);
	int k=h[x]-h[y];
	for(int i=0; i<=maxk; i++) {
		int q=(1<<i);
		if(q&k) {
			x=fa[x][i];
			ans=min(ans,w[x][i]);
//			printf("%d ",ans);
		}
	}
//	puts("");
//	if(x==y)return ans;
	for(int i=maxk; i>=0; i--) {
		if(fa[x][i]!=fa[y][i]) {
			x=fa[x][i];
			y=fa[y][i];
			ans=min(ans,w[x][i]);
			ans=min(ans,w[y][i]);
//			printf("%d ",ans);
		}
	}
//	puts("");
	ans=min(ans,min(w[x][0],w[y][0]));
	return ans;
}
int main() {
	scanf("%d%d",&n,&m);
	for(int i=1; i<=m; i++) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].d);
	sort(a+1,a+m+1,cmp);
	for(int i=1; i<=n; i++)z[i]=i;
	for(int i=1; i<=m; i++) {
		int x=a[i].x,y=a[i].y,d=a[i].d;
		if(_find(x)!=_find(y)) {
			if(len>=n-1)break;
			add(x,y);
			g[x].push_back(make_pair(y,d));
			g[y].push_back(make_pair(x,d));
			len++;
		}
	}
//	for(int i=1;i<=n;i++){
//		for(int j=0;j<g[i].size();j++){
//			printf("%d %d ",g[i][j].first,g[i][j].second);
//		}
//		puts("");
//	}
	fa[1][0]=-1;
	bfs();
	ini();
//	for(int i=0; i<=maxk; i++) {
//		for(int j=1; j<=n; j++) {
//			printf("%d ",w[j][i]);
//		}
//		puts("");
//	}
	scanf("%d",&q);
	for(int i=1; i<=q; i++) {
		int u,v;
		scanf("%d%d",&u,&v);
		printf("%d\n",LCA(u,v));
	}
	return 0;
}

主要问题是存最小距离的w数组在我初始化后全是零

求解答

2021/1/18 22:09
加载中...