描述:
校园里有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;
}