poj 2485 highways

比较简单的最小生成树。不过这个题目是让你输出组成最小生成树的那条最长的边的长度。其实这种题目用kruskal算法最好做了,闲的蛋疼的写了个primer算法。用primer关键是要搞清楚primer算法的原理,以及一步步的操作就好了。用primer算法的关键就是,搞清楚现在加进去的节点的原来的长度。看程序。

#include<iostream>
#include<stdio.h>
using namespace std;
int map[1000][1000];
struct node{
	int start;
	int end;
};
node road[1000];
int flag[1000];
int cun[1000][1000];
int main()
{
	int t,i,j,traget,ko;
	int dist,mini;
	int n;
	cin>>t;
	while(t--)
	{
		scanf("%d",&n);
		ko=0;
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
			{
				scanf("%d",&map[i][j]);
				cun[i][j]=map[i][j];
			}
		for(i=1;i<=n;i++)
		{
			flag[i]=0;
			map[i][i]=65550;
			cun[i][i]=65550;
			road[i].start=1;
			road[i].end=i;
		}
		flag[1]=1;
		dist=0;
		for(i=2;i<=n;i++)
		{
			traget=1;
			mini=65550;
			for(j=1;j<=n;j++)
			{
				if(flag[j]==0&&map[1][j]<mini)
				{
					mini=map[1][j];
					traget=j;
				}
			}
			flag[traget]=1;
			dist=dist+mini;
			if(cun[road[traget].start][road[traget].end]>ko)
				ko=cun[road[traget].start][road[traget].end];
			for(j=1;j<=n;j++)
			{
				if(flag[j]==0&&map[traget][j]<map[1][j])
				{
					map[1][j]=map[traget][j];
					road[j].start=traget;
				}
			}
		}
		printf("%d\n",ko);
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值