求助大佬,tarjan做法,8后面的数据都re了。
查看原帖
求助大佬,tarjan做法,8后面的数据都re了。
697481
Charl楼主2022/3/24 19:00
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) { new Main().run();  }

    
    class node{
    	int e;
    	int ne;
    	int num;
    	node(int e,int ne)
    	{
    		this.e=e;this.ne = ne;
    	}
    	node(int e,int ne,int num)
    	{
    		this.e = e;this.ne =ne;this.num = num;
    	}
    }
    int N = 550010;
    int fa[] = new int[N],h[] = new int[N],hq[] =new int[N];
    boolean st[] = new boolean[N];
    node edge[] = new node[2*N],query[] =new node[N];
    int ans[] = new int[N];
    int n,m,s,cnt,qcnt;
    
    
    int find(int x)
    {
    	if(x==fa[x]) return x;
    	return fa[x] = find(fa[x]);
    }
    
    void tarjan(int x)
    {
    	st[x]= true;
    	
    	for(int i=h[x];i!=-1;i=edge[i].ne)
    	{
    		int y = edge[i].e;
    		if(st[y]==false)
    		{
    			tarjan(y);
    			fa[y] = x;
    		}
    	}
    	
    	for(int i=hq[x];i!=-1;i=query[i].ne)
    	{
    		int y = query[i].e;
    		if(st[y]==true)
    			ans[query[i].num] = find(y);
    	}
    }
    
    void addedge(int a,int b)
    {
    	edge[cnt] =new node(b,h[a]);
    	h[a] = cnt++;
    }
    
    void addquery(int a,int b,int num)
    {
    	query[qcnt] =new node(b,hq[a],num);
    	hq[a] = qcnt++;
    }
    
    void run()
    {
		Scanner sc = new Scanner(System.in);
		
		n =sc.nextInt();m=sc.nextInt();s=sc.nextInt();
		Arrays.fill(h, -1);Arrays.fill(hq, -1);
		for(int i=1;i<n;i++)
		{
			fa[i] = i;
			int a,b;a=sc.nextInt();b=sc.nextInt();
			addedge(a,b);addedge(b,a);
		}
		fa[n] = n;
		for(int i=1;i<=m;i++)
		{
			int a,b;
			a=sc.nextInt();b=sc.nextInt();
			addquery(a,b,i);addquery(b,a,i);
		}
		tarjan(s);
		for(int i=1;i<=m;i++) System.out.println(ans[i]);
    }
}
2022/3/24 19:00
加载中...