最小生成树 prim

#include <iostream>
#include <cstdio>
#include <cstring>
const int INF=1000000000;
const int maxn=510;
using namespace std;

int map[maxn][maxn],dis[maxn],visited[maxn];
int main()
{
	int n,a,b,k,i,j,N,E,mindistance,min,t;
	scanf("%d",&n);
	while (n--)
	{
		memset(visited,0,sizeof(visited));
		mindistance=0;
		scanf("%d%d",&N,&E);
		for (i=0;i<N;i++)
		{
			for (j=0;j<N;j++)
			{
				map[i][j]=INF;
			}
		}
		for (i=0;i<E;i++)
		{
			scanf("%d%d%d",&a,&b,&k);
			map[a][b]=map[b][a]=k;
		}
		for (j=0;j<N;j++)
		{
			dis[j]=map[0][j];//初始化最短距离
		}
		visited[0]=1;//标记已经连接此点
		for (i=0;i<N;i++)
		{		
			min=INF;
			for (j=0;j<N;j++)
			{
				if(!visited[j] && min>dis[j])
				{
					min=dis[j];
					t=j;
				}
			}
			if(min!=INF)//值得注意的地方
				mindistance+=min;//总耗费
			visited[t]=1;
			for (j=0;j<N;j++)
			{
				if (!visited[j] && dis[j]>map[t][j])
				{
					dis[j]=map[t][j];//更新已连接的点与各无连接的点的最短距离
				}
			}
		}
		printf("%d\n",mindistance);
	}
	return 0;
}

Sample Input

1
3 3
0 1 5
0 2 0
1 2 9

Sample Output

5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值