一、合根植物
题目链接:合根植物
import java.util.*; import java.util.LinkedList; public class Main { static int n,m; static int[] father=new int[1000010]; static int[] father_sum=new int[1000010];//表示以该根节点为首的树有多少节点 static int k; public static void main(String[] args) { Scanner scanner=new Scanner(System.in); n=scanner.nextInt(); m=scanner.nextInt(); k=scanner.nextInt(); init(); while(k--!=0){ int l=scanner.nextInt(); int r=scanner.nextInt(); merage(l,r); } int ans=0; for(int i=1;i<=n*m;i++){ if(father[i]==i){ ans++; } } System.out.println(ans); } public static void init(){ for(int i=1;i<=n*m;i++){ father[i]=i; } for(int i=1;i<=n*m;i++){ father_sum[i]=1; } } public static void merage(int x,int y){ //合并x和y int fax=find(x),fay=find(y); if(fax!=fay){ //数量小的合并到数量多的,目的是为了减少复杂度 if(father_sum[fax]<father_sum[fay]){ int t; t=fax; fax=fay; fay=t; } //fay就是最少的 //fay合并到fax father[fay]=fax; } } public static int find(int x){ //查找x的根节点 if(father[x]==x){ return x; } else{ father[x]=find(father[x]); return father[x]; } } }
二、修改数组
题目链接:修改数组
import java.util.Scanner; public class Main { static int Maxn=1000005; static int fa[]; static void init() { for(int i=0 ;i<=Maxn;i++) fa[i]=i; } static int find(int x) { if(x == fa[x]) return x; else { fa[x] = find(fa[x]); //父节点设为根节点 return fa[x]; //返回父节点 } } static void merge(int i, int j) { fa[find(i)] = find(j); } static int n,m; //n行,m列 static int k; //k次合根 public static void main(String[] args) { Scanner in = new Scanner(System.in); n=in.nextInt(); fa=new int[Maxn+100]; init(); for(int i=1; i<=n; i++) { int t; t=in.nextInt(); t=find(t); System.out.print(t+" "); merge(t,t+1); } } }