1 solutions

  • 0
    @ 2025-11-5 17:29:28

    C++ :

    #include <cstdio>
    #include <queue>
    #include <cstring>
    #include <algorithm>
    #define MIN(a,b) ((a)>(b)?(b):(a))
    
    using namespace std;
    
    int n,m,father[10010],tot,b[10010],deep[10010];
    int f[10010][20],dis[10010][20];
    
    struct ai{
    	int x,y,w,last;
    }a[100010];
    
    struct at{
    	int x,y,w;
    }c[100010];
    
    void jr(int x,int y,int w)
    {
    	tot++;
    	a[tot].x=x;
    	a[tot].y=y;
    	a[tot].w=w;
    	a[tot].last=b[x];
    	b[x]=tot;
    }
    
    bool cop(const at &a,const at &b)
    {
    	return a.w>b.w;
    }
    
    int getf(int x)
    {
    	if(father[x]==x)
    		return x;
    	return father[x]=getf(father[x]);
    }
    
    void dfs(int x)
    {
    	for(int i=1;i<=15;i++)
    	{
    		f[x][i]=f[f[x][i-1]][i-1];
    		dis[x][i]=MIN(dis[x][i-1],dis[f[x][i-1]][i-1]);
    	}
    	for(int i=b[x];i;i=a[i].last)
    	{
    		int y=a[i].y;
    		if(!deep[y])
    		{	
    			deep[y]=deep[x]+1;
    			f[y][0]=x;
    			dis[y][0]=a[i].w;
    			dfs(y);
    		}
    	}
    }
    
    void swap(int &a,int &b)
    {
    	int c=a;
    	a=b;
    	b=c;
    }
    
    void bzlca(int x,int y)
    {
    	int ans=0x3fffffff;
    	if(deep[x]<deep[y]) swap(x,y);
    	for(int i=15;i>=0;i--)
    	{
    		if(deep[f[x][i]]>=deep[y])
    		{
    			ans=MIN(ans,dis[x][i]);
    			x=f[x][i];
    		}
    	}
    	if(x==y)
    	{
    		printf("%d\n",ans);
    		return;
    	}
    	for(int i=15;i>=0;i--)
    	{
    		if(f[x][i]!=f[y][i])
    		{
    			ans=MIN(MIN(dis[x][i],ans),dis[y][i]);
    			x=f[x][i];
    			y=f[y][i];
    		}
    	}
    	ans=MIN(MIN(dis[x][0],dis[y][0]),ans);
    	
    	printf("%d\n",ans);
    	return;
    }
    
    int main()
    {
    	memset(dis,0x3f,sizeof(dis));
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;i++)
    	{
    		father[i]=i;
    	}
    	for(int i=1;i<=m;i++)
    	{
    		scanf("%d%d%d",&c[i].x,&c[i].y,&c[i].w);
    	}	
    	sort(c+1,c+m+1,cop);
    	for(int i=1;i<=m;i++)
    	{
    		int a=getf(c[i].x);
    		int b=getf(c[i].y);
    		if(a!=b)
    		{
    			father[a]=b;
    			jr(c[i].x,c[i].y,c[i].w);
    			jr(c[i].y,c[i].x,c[i].w);
    		}
    	}
    	for(int i=1;i<=n;i++)
    	{
    		if(!deep[i])
    		{
    			deep[i]=1;
    			dfs(i);
    		}
    	}
    	int q;
    	scanf("%d",&q);
    	for(int i=1;i<=q;i++)
    	{
    		int x,y;
    		scanf("%d%d",&x,&y);
    		if(getf(x)!=getf(y))
    		{
    			printf("-1\n");
    		}
    		else
    		{
    			bzlca(x,y);
    		}
    	}
    	return 0;
    }
    
    • 1

    Information

    ID
    18481
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By