数据参考
百度经验
博客园 楠楠IT
测试接口 牛客 连通工程
问题背景
求国家建设公路的最小开销

算法思想
首先建立 邻接矩阵
然后 设定最小消耗顶点(就是两个定点之间的权重最小)顶点集合 U
每次从 矩阵中找出没有被访问过的点到已经在集合U中的点的距离的最小值,然后把这个顶点放入集合U中。

有任何问题请联系 1049188593@qq.com

#include <iostream>
#include <deque>
#include <fstream>
#include <vector>
using namespace std;

#ifdef debug
ifstream ifile("case2.txt");
#define cin ifile
#endif

#define Inf 10000000
int arc[101][101];// 连接矩阵
vector<bool> visited;// 标记是否访问过
int Prim(int vexnum, vector<int> &u)// 集合U
{
	long long sumMoney = 0;
	u.resize(1);
	u[0] = 0; // 表示从 0 出发遍历整幅图
	visited[0] = true;// 表示访问过
	while (u.size() != vexnum)
	{
		int min = Inf;// 找出值最小的边
		int nextAddPoint = -1;// 最小值所对应没有访问到的节点
		for (int i = 0; i < u.size(); i++)
		{
			for (int j = 0; j < vexnum; j++)
			{
				if (!visited[j] && arc[u[i]][j] < min)
				{
					min = arc[u[i]][j];
					nextAddPoint = j;
				}
			}
		}
		visited[nextAddPoint] = true;
		u.push_back(nextAddPoint);
		sumMoney += min;
	}
	return sumMoney;
}
int main()
{
	int vexnum, edge, money;
	cin >> money >> edge >> vexnum;
	int x, y, value;
	visited.resize(vexnum);
	for (int i = 0; i < vexnum; i++)// 初始化邻接矩阵
	{
		for (int j = 0; j < vexnum; j++)
		{
			arc[i][j] = Inf;
		}
		visited[i] = false;// 所有的节点标记为没有访问过
	}
	for (int i = 0; i < edge; i++)// 邻接矩阵赋值
	{
		cin >> x >> y >> value;
		x--; y--;
		if (value > arc[x][y])
			continue;
		arc[x][y] = value;
		arc[y][x] = arc[x][y];
	}

	vector<int> u;
	long long rlt = Prim(vexnum, u);
	if (rlt > money)
	{
		cout << "No" <<endl;
	}
	else
	{
		cout << "Yes" <<endl;
	}

	system("pause");
	return 0;
}
posted on 2018-09-01 14:25  HDU李少帅  阅读(166)  评论(0)    收藏  举报