全 WA 求助
查看原帖
全 WA 求助
614725
masonpop楼主2022/12/6 18:06

思路就是 kruskalkruskal + 倍增,样例过了,交上去全 WA,调不出来,好像是kruskalkruskal 连边错了,求助!

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
const int inf=2e9;
struct mason{
	int x,y,w;
	bool operator<(const mason &o)const{
		return w>o.w;
	}
}e[maxn];
int n,m,q;
int head[maxn],to[maxn],nxt[maxn],ver[maxn],fa[maxn][20],tot,val[maxn][20],vis[maxn];
int dep[maxn],f[maxn];//f:并查集 
inline void add(int x,int y,int z)
{
	to[++tot]=y;
	nxt[tot]=head[x];
	head[x]=tot;
	ver[tot]=z;
}
inline int get(int x)
{
	if(x==f[x])return x;
	return f[x]=get(f[x]);
}
inline void kruskal()//求最大生成树 
{
	sort(e+1,e+m+1); 
    for(int i=1;i<=n;i++)f[i]=i; //init
    for(int i=1;i<=m;i++)
    {
    	if(get(e[i].x)!=get(e[i].y))
		{
            f[get(e[i].x)]=get(e[i].y);//合并 
            add(e[i].x,e[i].y,e[i].w);
            add(e[i].y,e[i].x,e[i].w);
        }
	}
        
}
inline void dfs(int x)//dfs
{
	vis[x]=1;
    for(int i=head[x];i;i=nxt[i])
	{
        int y=to[i];
        if(vis[y])continue;
        dep[y]=dep[x]+1;
        fa[y][0]=x;val[y][0]=ver[i];
        dfs(y);
    }
}
inline int query(int x,int y)
{
	if(get(x)!=get(y))return -1;
    int ans=inf;
    if(dep[x]>dep[y])swap(x,y);//交换 
    for(int i=20;i>=0;i--)//跳 
    {
    	if(dep[fa[y][i]]>=dep[x])
		{
            ans=min(ans,val[y][i]); 
            y=fa[y][i];
        }
	}
    if(x==y)return ans;
    for(int i=20;i>=0;i--)
    {
    	if(fa[x][i]!=fa[y][i])
		{
            ans=min(ans,min(val[x][i],val[y][i])); //更新 
            x=fa[x][i];y=fa[y][i];
        }
	}
    ans=min(ans,min(val[x][0],val[y][0]));//最后一层 
    return ans;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].w);
	kruskal();
	for(int i=1;i<=n;i++)
	{
		if(!vis[i])
		{
			dep[i]=1;
			dfs(i);
			fa[i][0]=i;
			val[i][0]=inf;//dfs
		}
	}
	for(int j=1;j<=20;j++)
	{
		for(int i=1;i<=n;i++)
		{
			val[i][j]=min(val[i][j-1],val[fa[i][j-1]][j-1]);
			fa[i][j]=fa[fa[i][j-1]][j-1];
		}
	}
	scanf("%d",&q);
	while(q--)
	{
		int dr,dt;
		scanf("%d%d",&dr,&dt);
		printf("%d\n",query(dr,dt));
	}
	return 0;
}
/*
5 7
4 3 4440
3 1 22348
1 3 28368
2 4 25086
5 3 6991
4 3 10638
3 1 11106
4
4 5
1 3
5 4
2 5

*/
2022/12/6 18:06
加载中...