爆0求调!
查看原帖
爆0求调!
654763
smallpeople楼主2024/2/27 19:29
#include<bits/stdc++.h>
using namespace std;

struct node
{
	int p1,p2,d;
}ed[50005];//存p1与p2 之间 长度为d的边,即无向 
struct edge
{
	int to,cost;
};
int n,m,c,f[10005],depth[10005],fa[10005][30],fe[10005][30];//fa[i][j] 从i点向上走2^j步会走到哪里,fe[i][j] 从i点向上走2^j步经过的所有边的边权最小值 
vector <edge> q[10005];

bool cmp(node a,node b)
{
	return a.d > b.d;
}

int find(int n)
{
	if(n == f[n])return n;
	else return f[n] = find(f[n]);
}

void kruskal()
{
	sort(ed + 1,ed + m + 1,cmp);
	for(int i = 1;i <= n;i ++)
		f[i] = i;
	for(int i = 1;i <= m;i ++)
	{
		int p1 = ed[i].p1,p2 = ed[i].p2,l = ed[i].d;
		if(find(p1) != find(p2))
		{
			f[find(p1)] = find(p2);
			
			//在最大生成树上建新图 
			q[p1].push_back(edge{p2,l});
			q[p2].push_back(edge{p1,l});
		}
	}
	return;
}

void dfs(int p1,int f,int d)//深搜到p1点,p1父亲为f,f与p1间的边边权为d 
{
	depth[p1] = depth[f] + 1;
	fa[p1][0] = f;
	fe[p1][0] = d;
	
	for(int i = 1;i <= 20;i ++)
	{
		fa[p1][i] = fa[fa[p1][i - 1]][i - 1];
		fe[p1][i] = min(fe[p1][i - 1],fe[fa[p1][i - 1]][i - 1]);
	}
	
	for(int i = 0;i < q[i].size();i ++)
	{
		int p2 = q[p1][i].to,d = q[p1][i].cost;
		if(p2 != f)dfs(p2,p1,d);
	}
	return;
}

int lca(int p1,int p2)
{
	if(find(p1) != find(p2))return -1;
	
	int ans = 2147483647;
	if(depth[p1] < depth[p2])swap(p1,p2);//保证p1深度更大 
	
	for(int i = 20;i >= 0;i --)
		if(depth[fa[p1][i]] != depth[p2])
		{
			ans = min(ans,fe[p1][i]);
			p1 = fa[p1][i];
		}
	if(p1 == p2)return ans;
	for(int i = 20;i >= 0;i --)
		if(fa[p1][i] != fa[p2][i])
		{
			ans = min(ans,min(fe[p1][i],fe[p2][i]));
			p1 = fa[p1][i];
			p2 = fa[p2][i];
		}
	ans = min(ans,min(fe[p1][0],fe[p2][0]));
	return ans;
}

int main()
{
	
	cin>>n>>m;
	for (int i = 1;i <= m;i ++)
		cin>>ed[i].p1>>ed[i].p2>>ed[i].d;
	
	kruskal();
	
	dfs(1,0,0);
	
	cin>>c;
	for(int i = 1;i <= c;i ++)
	{
		int x,y;
		cin>>x>>y;
		cout<<lca(x,y)<<'\n';
	}
	return 0;
}

样例都过不去,除了-1全是0。求大佬帮调!!!

2024/2/27 19:29
加载中...