算法(第四版)答案 1.5案例研究

1.5.1

1.5.2


1.5.3


1.5.4


1.5.7

#pragma once
class QuickFindUF
{
private:
	int* id;
	int arraySize;
	int count;
public:
	QuickFindUF(int N);
	~QuickFindUF();
	void unionPQ(int p, int q);
	int find(int p) const;
	bool connected(int p, int q) const;
	int remain() const;

};

#include "stdafx.h"
#include "QuickFindUF.h"


QuickFindUF::QuickFindUF(int N)
{
	arraySize = N;
	count = N;
	id = new int[N];
	for (int i = 0; i < N; i++)
		id[i] = i;

}

int QuickFindUF::remain() const
{
	return count;
}

bool QuickFindUF::connected(int p, int q) const
{
	return find(p) == find(q);
}

int QuickFindUF::find(int p) const
{
	return id[p];
}

void QuickFindUF::unionPQ(int p, int q)
{
	int pID = find(p);
	int qID = find(q);
	if (pID == qID) return;
	for (int i = 0; i < arraySize; i++)
		if (id[i] == qID) id[i] = pID;
	count--;
}

QuickFindUF::~QuickFindUF()
{
	delete[] id;
}
#include "stdafx.h"
#include "QuickFindUF.h"
#include "string"
#include "vector"
#include "iostream"
#include "fstream"



int main()
{
	std::ifstream in("G:\\数据结构与算法\\算法第四版\\tinyUF.txt");
	int size;
	in >> size;
	QuickFindUF uf(size);
	int p, q;
	while (in >> p >> q)
	{
		if (uf.connected(p, q))
			continue;

		uf.unionPQ(p, q);
		std::cout << p << " " << q<<std::endl;
	}
	std::cout << uf.remain() << " components";



	system("pause");

}
#pragma once
class QuickUnionUF
{
private:
	int* id;
	int arraySize;
	int count;
public:
	QuickUnionUF(int N);
	~QuickUnionUF();
	void unionPQ(int p, int q);
	int find(int p) const;
	bool connected(int p, int q) const;
	int remain() const;
};
#include "stdafx.h"
#include "QuickUnionUF.h"


QuickUnionUF::QuickUnionUF(int N)
{
	arraySize = N;
	count = N;
	id = new int[N];
	for (int i = 0; i < N; i++)
		id[i] = i;
}

int QuickUnionUF::remain() const
{
	return count;
}

bool QuickUnionUF::connected(int p, int q) const
{
	return find(p) == find(q);
}

int QuickUnionUF::find(int p) const
{
	while (p != id[p]) p = id[p];
	return p;
}

void QuickUnionUF::unionPQ(int p, int q)
{
	int i = find(p);
	int j = find(q);
	if (i == j) return;

	id[j] = i;
	count--;
}

QuickUnionUF::~QuickUnionUF()
{
	delete[] id;
}
#include "stdafx.h"
#include "QuickFindUF.h"
#include "QuickUnionUF.h"
#include "string"
#include "vector"
#include "iostream"
#include "fstream"



int main()
{
	std::ifstream in("G:\\数据结构与算法\\算法第四版\\tinyUF.txt");
	int size;
	in >> size;
	QuickUnionUF uf(size);
	int p, q;
	while (in >> p >> q)
	{
		if (uf.connected(p, q))
			continue;

		uf.unionPQ(p, q);
		std::cout << p << " " << q<<std::endl;
	}
	std::cout << uf.remain() << " components";



	system("pause");

}

1.5.8

当i>=p时,并未改变后续内容。

1.5.9

5->6 和 6->1有问题

1.5.11

减少了每次需要改变元素的个数

1.5.12

#pragma once
class QuickUnionUF
{
private:
	int* id;
	int arraySize;
	int count;
public:
	QuickUnionUF(int N);
	~QuickUnionUF();
	void unionPQ(int p, int q);
	int find(int p) const;
	bool connected(int p, int q) const;
	int remain() const;
};
#include "stdafx.h"
#include "QuickUnionUF.h"


QuickUnionUF::QuickUnionUF(int N)
{
	arraySize = N;
	count = N;
	id = new int[N];
	for (int i = 0; i < N; i++)
		id[i] = i;
}

int QuickUnionUF::remain() const
{
	return count;
}

bool QuickUnionUF::connected(int p, int q) const
{
	return find(p) == find(q);
}

int QuickUnionUF::find(int p) const
{
	int x = p;
	while (x != id[x]) x = id[x];
	while (p != id[p])
	{
		int tmp = p;
		p = id[p];
		id[tmp] = x;
	}
	return x;
}

void QuickUnionUF::unionPQ(int p, int q)
{
	int i = find(p);
	int j = find(q);
	if (i == j) return;

	id[j] = i;
	count--;
}

QuickUnionUF::~QuickUnionUF()
{
	delete[] id;
}
1.5.13
#pragma once
class WeightedQuickUnion
{
private:
	int count;
	int* id;
	int* sz;
	int arraySize;
public:
	WeightedQuickUnion(int N);
	int size();
	int find(int p);
	void unionPQ(int p, int q);
	bool connected(int p, int q)
	{
		return find(p) == find(q);
	}
	~WeightedQuickUnion();
};
#include "stdafx.h"
#include "WeightedQuickUnion.h"


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


WeightedQuickUnion::~WeightedQuickUnion()
{
	delete[] id;
	delete[] sz;
}

int WeightedQuickUnion::size()
{
	return count;
}
int WeightedQuickUnion::find(int p)
{
	int x = p;
	while (x != id[x]) x = id[x];
	while (p != id[p])
	{
		int tmp = p;
		p = id[p];
		id[tmp] = x;
	}
	return x;
}
void WeightedQuickUnion::unionPQ(int p, int q)
{
	int i = find(p);
	int j = find(q);
	if (sz[i] <= sz[j])
	{
		id[i] = j;
		sz[j] += sz[i];
	}
	else
	{
		id[j] = i;
		sz[i] += sz[j];
	}
	count--;
}

1.5.14

void WeightedQuickUnion::unionPQ(int p, int q)
{
	int i = find(p);
	int j = find(q);
	if (sz[i] <= sz[j])
	{
		id[i] = j;
		sz[j] = std::max(sz[j],sz[i]+1);
	}
	else
	{
		id[j] = i;
		sz[i] = std::max(sz[i], sz[j] + 1);
	}
	count--;
}
1.5.17
int main()
{
	
	Timer timer;
	int total = 0;
	srand((unsigned)time(NULL));

	int size;
	std::cin >> size;
	WeightedQuickUnion uf(size);
	while (uf.remain() > 1)
	{
	
		int p = rand() % size;
		int q = rand() % size;
		
		if (uf.connected(p, q))
			continue;
		
		uf.unionPQ(p, q);
		std::cout << p << " " << q << std::endl;
		total++;
	}
	std::cout << total << " links" << std::endl;
	timer.stop();
	system("pause");
}

1.5.18



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值