您的位置:首页 > 其它

算法 1.5节:带路径压缩的加权并查集

2018-01-01 21:20 155 查看
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;

public class UF_1
{
private int[] id;
private  int[]sz;
private  int count;

public UF_1(int N)
{
count=N;
id = new int
;
for(int i = 0; i<N ; i++)
id[i]=i;
sz = new int
;
for(int i=0;i<N;i++)
sz[i]=1;
}

public void union(int p, int q)
{
int i = find(p);
int j = find(q);
if ( i== j )
return;
if(sz[p]<sz[q])
{
id[i] = j;
sz[j] += sz[i];
}
else {
id[j] =i;
sz[i] = sz[j];
}
count--;
}

public int find (int p)
{
while(p != id[p])
{
id[p]=id[id[p]];
p = id[p];
}

return p;
}

public boolean connected (int p, int q)
{
return find(p) == find(q);
}

public int count()
{
return count;
}

public static void main(String[] args)
{
int N = StdIn.readInt();
UF_1 uf = new UF_1(N);
while (!StdIn.isEmpty()) {
int p = StdIn.readInt();
int q = StdIn.readInt();
if (uf.connected(p, q))
continue;
uf.union(p, q);
StdOut.println(p + " " +
4000
q);
}
StdOut.println(uf.count() + "components");
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: