每日一练

SeedCoder2014热身题目2:校园网络

描述: 
校园里有N(1≤N≤500)台计算机,现在我们测得这些计算机两两之间的Ping时间,得到对称矩阵Pij(1≤

i,j≤N)。现在,我们需要用若干直连线将这N台计算机连接起来,使得任意两台计算机之间可直接或间接

地通信。我们认为,计算机A可以和自身通信,Ping时间规定为0;若A和B之间有直连线且Ping时间为p,则

B和A的Ping时间也为p;若A和B之间可以通信,B和C之间可以通信,则A和C之间可间接通信(A≠B≠C)。
  对于每一种连接方案,记T=max{Pij|i和j可直接通信}。请你编程计算所有连接方案中T的最小值。 
输入
  输入数据的第一行为一个整数N(1≤N≤500),表示计算机数目;
  接下来是一个N×N的对称正整数矩阵,表示计算机两两之间的Ping时间,整数的范围不超过5000。
  注意:数据量大,强烈建议使用scanf()读入,C++流输入会浪费大量时间。 
输出
  输出数据只有一个整数,为T的最小值。 
样例:
输入:
6
0 1009 2833 2387 3333 3917
1009 0 1349 2600 2950 2437
2833 1349 0 2763 4484 1555
2387 2600 2763 0 2675 3632
3333 2950 4484 2675 0 4607
3917 2437 1555 3632 4607 0
输出:
2675


#include <stdio.h>
#include <iostream>
using namespace std;
int findMinT(int** a,int n)
{
	int T1=0,T2=0,T=0;
	int* min=new int[n-1];
	memset(min,0,sizeof(min));
	for(int i=0;i<n-1;i++)
	{
		min[i]=*((int*)a+n*i+i+1);
		for(int j=i+2;j<n;j++)
		{
			if(*((int*)a+n*i+j)<min[i])
				min[i]=*((int*)a+n*i+j);
		}
	}
	T1=min[0];
	for(int i=0;i<n-1;i++)
	{
		if(T1<min[i])
			T1=min[i];
		min[i]=0;
	}
	for(int i=0;i<n-1;i++)
	{
		min[i]=*((int*)a+n*(i+1)+i);
		for(int j=i+2;j<n;j++)
		{
			if(*((int*)a+n*j+i)<min[i])
				min[i]=*((int*)a+n*j+i);
		}
	}
	T2=min[0];
	for(int i=0;i<n-1;i++)
	{
		if(T2<min[i])
			T2=min[i];
		min[i]=0;
	}
	T=T1<T2?T1:T2;
	return T;
}


int main()
{
	int c;
//	scanf("%d",c);
	cin>>c;
	int** a=new int*[c];
	for(int i=0;i<c;i++)
	{
		a[i]=new int[c];
	}
	for(int i=0;i<c;i++)
	{
		for(int j=0;j<c;j++)
			scanf("%d",((int*)a+i*c+j));
	}
	
	
	int T=findMinT(a,c);
	cout<<T<<endl;
	
	
	for(int i=0;i<c;i++)
		delete [] a[i];
	delete [] a;
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值