1.5.12使用路径压缩的quick-union算法。根据路径压缩修改quick-union算法(请见1.5.2.3节),在find()方法中添加一个循环来将从p到根节点的路径上的每个触点都连接到根节点。给出一列输入,使该方法能够产生一条长度为4的路径。注意:该算法的所有操作的均摊成本已知为对数级别。
答:
0-1
1-2
2-3
3-4
![图片](http://r.photo.store.qq.com/psb?/f33bb27a-608a-4097-811a-86bbde18cf7a/Is2JmUkpQzFa0OQxg7YafBuQSH.tcUTxuVi7UsBSXG4!/o/dLEAAAAAAAAA&ek=1&kp=1&pt=0&bo=ogHNAaIBzQEDACU!&tl=1&su=0147833025&tm=1540519200&sce=0-12-12&rf=2-9)
![图片](http://r.photo.store.qq.com/psb?/f33bb27a-608a-4097-811a-86bbde18cf7a/Zzn5T3XYsXM6*hO7j28qP5EyF7xXTNv5VqW4LgL.3Yg!/o/dCABAAAAAAAA&ek=1&kp=1&pt=0&bo=3gGcAN4BnAADACU!&tl=1&su=060030289&tm=1540519200&sce=0-12-12&rf=2-9)
tinyUF.txt
5
0
1
1
2
2
3
3
4
public class E1d5d12
{
private int[] id;
private int count;
public E1d5d12(int N)
{
count=N;
id=new int[N];
for (int i=0;i<N;i++)
id[i]=i;
}
public int count()
{return count;}
boolean connected(int p,int q)
{return find(p)==find(q);}
public int find(int p)
{
int temp=p;
//find root
while(p!=id[p]) p=id[p];
int root=p;
//set all node's father is root
p=temp;
while(root!=id[p])
{
temp=id[p];
id[p]=root;
p=temp;
}
return root;
}
public void union(int p,int q)
{
int pRoot=find(p);
int qRoot=find(q);
if(pRoot==qRoot) return;
id[pRoot]=qRoot;
count--;
}
public static void main(String[] qrgs)
{
int N=StdIn.readInt();
E1d5d12 uf=new E1d5d12(N);
while (!StdIn.isEmpty())
{
int p=StdIn.readInt();
int q=StdIn.readInt();
if(uf.connected(p,q)) continue;
StdOut.printf("p=%d q=%d ",p,q);
uf.union(p,q);
}//end while
}//end main
}//end class
答:
0-1
1-2
2-3
3-4
tinyUF.txt
5
0
1
1
2
2
3
3
4
public class E1d5d12
{
private int[] id;
private int count;
public E1d5d12(int N)
{
count=N;
id=new int[N];
for (int i=0;i<N;i++)
id[i]=i;
}
public int count()
{return count;}
boolean connected(int p,int q)
{return find(p)==find(q);}
public int find(int p)
{
int temp=p;
//find root
while(p!=id[p]) p=id[p];
int root=p;
//set all node's father is root
p=temp;
while(root!=id[p])
{
temp=id[p];
id[p]=root;
p=temp;
}
return root;
}
public void union(int p,int q)
{
int pRoot=find(p);
int qRoot=find(q);
if(pRoot==qRoot) return;
id[pRoot]=qRoot;
count--;
}
public static void main(String[] qrgs)
{
int N=StdIn.readInt();
E1d5d12 uf=new E1d5d12(N);
while (!StdIn.isEmpty())
{
int p=StdIn.readInt();
int q=StdIn.readInt();
if(uf.connected(p,q)) continue;
StdOut.printf("p=%d q=%d ",p,q);
uf.union(p,q);
}//end while
}//end main
}//end class