poj2485-最小生成树(prime+kruskal)

最小生成树 记录该最小生成树上的一个最长的路径 scanf接收数据
//kruskal  不断加没有加进最小的边 保证 两个点至少一个没加进点集
#include<iostream>
#include <stdio.h>
#include<algorithm>
using namespace std;
int father[505];
int fun(int x)
{
	return x==father[x]?father[x]:fun(father[x]);
}
struct point
{
	int x,y,data;
}map[130000];
int com(struct point A,struct point B)
{
	return A.data<B.data;
}
int main()
{
	int N;
	cin>>N;
	while (N--)
	{
		int n,i,j;int len=0;
		cin>>n;
		for (i=0;i<n;i++)
		{
			father[i]=i;
			int num;j=0;
			while(j<n)
			{
				scanf("%d",&num);
				if(j>i)
				{
					map[len].x=i;
					map[len].y=j;
					map[len].data=num;
					len++;
				}
				j++;
			}
		}
		sort(map,map+len,com);
		int cnt=0;int Max=0;
		for (i=0;i<len;i++)
		{
			if (fun(map[i].x)!=fun(map[i].y))//两个点没有被全加进来过,可以加此边
			{
				father[fun(map[i].y)]=fun(map[i].x);
				cnt++;
				if (Max<map[i].data)
				{
					Max=map[i].data;
				}
			}
			if (cnt==n-1)
			{
				break;
			}
		}
		cout<<Max<<endl;
	}
	return 0;
}
 //prime 在已找过的点的集合里 找一条最小的边并且另一个点不在该集合
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
int edge[505];//记录最小边
int map[505][505];//记录整个图
bool point[505];//标记已经找过的点
int main()
{
 int N;
 cin>>N;
 while(N--)
 {
  int n;cin>>n;
  int Max=0;
  memset(map,0,sizeof(map));
  memset(point,0,sizeof(point));
  int i,j;
  for (i=0;i<n;i++)
  {
   for (j=0;j<n;j++)
   {
    scanf("%d",&map[i][j]);
   }
   edge[i]=65536;
  }
  int flag=0;//记录每次找到的点
  for (i=0;i<n;i++)
  { 
   int temp=65536;//记录最小边
   for (j=0;j<n;j++)//更新所有的边
   {
    if (map[flag][j]&&edge[j]>map[flag][j])
    {
     edge[j]=map[flag][j];
    } 
   }
   for (j=0;j<n;j++)//找到所有的边
   {
    if (point[j]==0&&edge[j]<temp)
    {
     temp=edge[j];
     flag=j;
    }
   }
   point[flag]=1;
   if (Max<temp)
   {
    Max=temp;
   }
  }
  cout<<Max<<endl;
 }
 return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值