码迷,mamicode.com
首页 > 其他好文 > 详细

hdu1301&poj1251 Jungle Roads(最小生成树之prim果题)

时间:2014-07-03 17:21:17      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:prim   最小生成树   


转载请注明出处:http://blog.csdn.net/u012860063

题目链接:

HDU:http://acm.hdu.edu.cn/showproblem.php?pid=1301

POJ: http://poj.org/problem?id=1251


一道prim算法的果题!


题目很长,这里就不贴题目了。

题意: 给你每个村庄之间的维护道路的费用,求最小的费用。

代码如下:


#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define INF 0xfffffff
#define N 147
int map[N][N];
int dis[N],vis[N];
//创建map二维数组储存图表,dis数组记录每2个点间最小权值.
//vis[N]数组标记某点是否已访问 
int min(int a, int b)
{
	return a<b?a:b;
}

int prim(int n, int sta)
{
	int i, j, k, MIN, sum = 0;
	for(i = 1; i <= n; i++)//第一次给dis数组赋值 
	{
		dis[i]=map[sta][i];
		vis[i] = 0;
	}
	vis[sta] = 1;//从某点开始,分别标记和记录该点
	for(i = 1; i < n; i++)//再运行n-1次  
	{
		MIN = INF; k = 0;
		for(j = 1; j <= n; j++)
		{
			if(vis[j]==0 && dis[j]<MIN)//找出最小权值并记录位置
			{
				k = j;
				MIN = dis[j];
			}
		}
		if(k != 0)
		{
			vis[k] = 1; //标记该点
			sum+=dis[k];//最小权值累加 
			for(j = 1; j <= n; j++)//更新权值
			{
				dis[j] = min(map[k][j],dis[j]);
			}
		}
	}
	return sum;
}

int main()
{
	int n, i, j, k, m,t;
	char ch,tt;
	int sum;
	while(cin >> n && n)
	{
		for(i = 1; i <= n; i++)
            for(j = 1; j <= n; j++)
                map[i][j]=INF;
			for(i = 1; i < n; i++)
			{
				cin>>ch>>m;
				for(j = 1; j <= m; j++)
				{
					cin>>tt>>t;
					//防止有重边出现
					map[ch-'A'+1][tt-'A'+1]=min(map[ch-'A'+1][tt-'A'+1],t);
					map[tt-'A'+1][ch-'A'+1]=map[ch-'A'+1][tt-'A'+1];
				}
			}
			sum = prim(n,1);
			cout<<sum<<endl;
	}
	return 0;
}



hdu1301&poj1251 Jungle Roads(最小生成树之prim果题),布布扣,bubuko.com

hdu1301&poj1251 Jungle Roads(最小生成树之prim果题)

标签:prim   最小生成树   

原文地址:http://blog.csdn.net/u012860063/article/details/36470395

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!