Prim’s Minimum Spanning Tree

#include "stdafx.h"
#include "stdio.h"
#include "iostream"
#include "string"
#include "sstream"
#include "cmath"


using namespace std;

struct islands
{
	int x;
	int y;
};

class route
{
public:
	int numi;
	float E;

	bool *sset;

	route();
	route(int n, float e);

	islands *isd;
	int **distmatrix;
	long sum;
	void addislands(int coor, int num, char c);
	void printoutislands();
	void printoutdistmatrix();
	void compdistmat();
	void connected();
	bool allcon();
	void prim();
	int min();
	int *mindis;

	~route()
	{
		delete[] isd;
		delete[] sset;
		for (int i = 0; i < numi; i++)
			delete[] distmatrix[i];
		delete[] distmatrix;
	}

	islands start;
};

void route::addislands(int coor, int num, char c)
{
	if (c == 'x')
	{
		isd[num].x = coor;
		sset[num] = 0;
		mindis[num] = INT_MAX;
	}
	else
	{
		isd[num].y = coor;
	}
};

route::route(int n, float e)
{
	this->numi = n;
	this->E = e;
	isd = new islands[n];
	sset = new bool[n];
	mindis = new int[n];
}

void route::printoutislands()
{
	for (int i = 0; i < numi; i++)
	{
		cout << isd[i].x << " ~ " << isd[i].y << endl;
	}
}

void route::printoutdistmatrix()
{
	for (int i = 0; i < numi; i++)
	{
		for (int j = 0; j < numi; j++)
		{
			cout << distmatrix[i][j] << " ";
		}
		cout << endl;
	}
}

void route::compdistmat()
{
	distmatrix = new int*[numi];
	for (int i = 0; i < numi; i++)
	{
		distmatrix[i] = new int[numi];
		for (int j = 0; j < numi; j++)
		{
			distmatrix[i][j] = sqrt(pow((isd[i].x - isd[j].x), 2) + pow((isd[i].y - isd[j].y), 2));
		}
	}
}


int route::min()
{
	int minIndex;
	int min = INT_MAX;
	for (int i = 0; i < numi; i++)
	{
		if ((sset[i] == 0) && (mindis[i] < min))
		{
			min = mindis[i];
			minIndex = i;
		}
	}

	return minIndex;
}

void route::prim()
{
	sset[0] = 1;
	for (int i = 0; i < numi; i++)
		mindis[i] = INT_MAX;
	mindis[0] = 0;

	sum = 0;

	for (int counter = 0; counter < numi-1; counter++)
	{
		for (int u = 0; u < numi; u++)
		{
			int tmpmin = INT_MAX;
			for (int v = 0; v < numi; v++)
			{
				if ((sset[u] == 0) && (sset[v] == 1))
				{
					if (distmatrix[u][v] < tmpmin)
					{
						mindis[u] = distmatrix[u][v];
					}
				}
			}
		}

		int tmp = min();
		sset[tmp] = 1;


		int tmpmin = INT_MAX;
		for (int v = 0; v < numi; v++)
		{
			if ((sset[v] == 1)&&(v!=tmp)&&(distmatrix[tmp][v]<tmpmin))
			{
				tmpmin = distmatrix[tmp][v];
			}
		}
		sum = sum + tmpmin;
	}

}

int _tmain(int argc, _TCHAR* argv[])
{
	int numi;
	float E;
	//	cin >> numi;
	//	cin.ignore();
	numi = 4;
	string linex;
	string liney;
	string tmp;

	//cin >> linex;
	//cin.ignore();
	//cin >> liney;
	//cin.ignore();
//sample input
	linex = "0 0 400 400";
	liney = "0 100 0 100";

	//	cin >> E;
	//	cin.ignore();
	E = 1.0;

	route myroute(numi, E);

	istringstream strx(linex);
	int counter = 0;
	while (getline(strx, tmp, ' '))
	{
		int x = atoi(tmp.c_str());
		//		cout << x << endl;
		myroute.addislands(x, counter, 'x');
		counter++;
	}

	counter = 0;
	istringstream stry(liney);
	while (getline(stry, tmp, ' '))
	{
		int y = atoi(tmp.c_str());
		//		cout << y << endl;
		myroute.addislands(y, counter, 'y');
		counter++;
	}

	myroute.compdistmat();
	myroute.printoutislands();
	myroute.printoutdistmatrix();
	myroute.prim();

	cout << myroute.sum << endl;

	system("pause");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值