打井问题

在偏远的山区,水资源很稀缺,因此,我们问每个山区进行打井工程,在不同的地方打了N口井,现在我们要在这N口井之间修建管道,要使得这些井都能连通,同时所使用的管道的长度最小,因此,需要你变成帮助我们实现这一问题。

测试用例:

Input :

2  //case的个数

3

0 1 4

1 0 2

4 2 0

4

0 4 9 21

4 0 8 17

9 8 0 16

21 17 16 0

Output:

Case #1

3

Case #2

28

分析:求图的最小生成树,有一篇文章讲的比较好,http://blog.csdn.net/qjzl2008/article/details/8008077

这里我实现的代码如下:

#include <iostream>
#define MAX 65535
#define MAXVEX 102
using namespace std;
typedef struct
{
	int arcs[MAXVEX][MAXVEX];
	int vexnum, arcnum;
}MGraph;
void minTree_Prim(MGraph &G, int* minCost, int* addVertex)
{
	int lowCost[MAXVEX]; //lowCost数组始终存放索引对应顶点到其他边的最小权值,随时修正权值情况
	addVertex[0] = 0;   //初始化第一个顶点  addVertext数组索引对应顶点存放边的另一个顶点
	lowCost[0] = 0;
	minCost[0] = 0;
	for (int i = 1; i<G.vexnum; i++)
	{
		addVertex[i] = 0;
		lowCost[i] = G.arcs[0][i];
	}
	int min = MAX;
	for (int i = 1; i<G.vexnum; i++)
	{
		min = MAX;
		int k = 0;
		for (int j = 1; j<G.vexnum; j++)
		{
			if (lowCost[j] && min>lowCost[j])   //lowCost为0时索引值对应顶点已添加到生成树中
			{
				min = lowCost[j];
				k = j;
			}
		}
		//cout << "(" << addVertex[k] << "," << k << ")" << endl;  //找出了最小的点
		minCost[k] = lowCost[k];
		lowCost[k] = 0;
		for (int j = 1; j<G.vexnum; j++)
		{
			if (lowCost[j] && lowCost[j]>G.arcs[k][j])    //修正lowCost数组
			{
				lowCost[j] = G.arcs[k][j];
				addVertex[j] = k;
			}
		}
	}
}
int main()
{
	int tc, T;
	cin >> T;
	for (tc = 1; tc <= T; tc++)
	{
		int N;
		cin >> N;

		MGraph myGraph;
		int arcs[MAXVEX][MAXVEX] = { 0 };

		for (int i = 0; i < N; i++)
		{
			for (int j = 0; j < N; j++)
			{
				cin >> arcs[i][j];
				if (!arcs[i][j])
					arcs[i][j] = MAX;
				myGraph.arcs[i][j] = arcs[i][j];
				//cout << myGraph.arcs[i][j] << " ";
			}
			//cout << endl;
		}
		myGraph.vexnum = N;
		int* minCost = (int*)malloc(sizeof(int)*MAX);
		int* vertexTree = (int*)malloc(sizeof(int)*MAX);
		minTree_Prim(myGraph, minCost, vertexTree);
		cout << "Case #" << tc << endl;
		int count = 0;
		for (int i = 0; i < N; i++)
			count+= minCost[i];
		cout << count << endl;
	}
	return 0;
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园悬赏任务平台对字典管理、论坛管理、任务资讯任务资讯公告管理、接取用户管理、任务管理、任务咨询管理、任务收藏管理、任务评价管理、任务订单管理、发布用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行校园悬赏任务平台程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。校园悬赏任务平台的开发让用户查看任务信息变得容易,让管理员高效管理任务信息。 校园悬赏任务平台具有管理员角色,用户角色,这几个操作权限。 校园悬赏任务平台针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理任务信息,管理任务资讯公告信息等内容。 校园悬赏任务平台针对用户设置的功能有:查看并修改个人信息,查看任务信息,查看任务资讯公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看任务,删除任务操作,新增任务操作,修改任务操作。任务资讯公告信息管理页面提供的功能操作有:新增任务资讯公告,修改任务资讯公告,删除任务资讯公告操作。任务资讯公告类型管理页面显示所有任务资讯公告类型,在此页面既可以让管理员添加新的任务资讯公告信息类型,也能对已有的任务资讯公告类型信息执行编辑更新,失效的任务资讯公告类型信息也能让管理员快速删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值