第一题:
import java.util.*;
public class UF1 {
int parent[];
public int root(int x){
while(parent[x]!=x){
x=parent[x];
}
return x;//找x的树根
}
public int size(int y){
int i=1;
while(parent[y]!=y){
i++;
y=parent[y];
}
return i;//树的层数
}
public boolean connect(int p, int q){
if(root(p)==root(q)){return true;}
else{return false;}
}//判断是否相连
public void union(int a, int b){
int pid=root(a);
int qid=root(b);
if(connect(a,b)){return;}
else{
if(size(a)>size(b)){parent[qid]=pid;}
else{parent[pid]=qid;}
}
}//按把没连的连上,遵从小连大的原则
}
第二题:
……
public int find(int y){
int z=0;
int j=0;
int k=0;
int max=0;
z=y;
while(parent[y]!=y){
if(y>parent[y]){z=y;}
else{z=parent[yx]}
y=parent[y];
}
for(j=z+1;j<n;j++){
if(root(z)==root(j)){k++;}
}
max=z+k;
return max;
}
……
第三题:
(待改,id[son[x]]=id[x]; id[x]=son[x],如图)
……
int id[];
int count=N;
for(int i=0;i<N;i++){id[i]=i+1}//整数序列
int order[];
for(i=0;i<M;i++){
Scanner input = new Scanner(System.in);
int a=input.nextInt();
order[i]=a
}//指令序列
int find[];//被去掉的数的所对应的下一个数组成的序列
for(i=0;i<M;i++){
int num=order[i];
id[num]=num;
id[num-1]=num+1;
count=count-1;
find[i]=num+1;
}
……