Bessie被雇来在农民约翰的N(2<n=1000)谷仓中建立一个廉价的互联网网络,方便地编号为1…N.FJ已经做了一些调查,发现M(1<M=20000)可能是谷仓之间的连接路线。每个可能的连接路径具有相关的成本C(1<C<=100000)。农场主约翰想花最少的钱连接网络,他甚至不想付钱给Bessie。
意识到农民约翰不会付钱给她,Bessie决定尽可能做最差的工作。她必须决定要安装的一组连接,以便(i)这些连接的总成本尽可能大,(ii)所有的谷仓连接在一起(这样就可以通过安装连接的路径从任何其他谷仓到达任何谷仓),和(iii)因此没有CY。克里斯之间的联系(农民约翰很容易就能发现)。条件(ii)和(iii)确保最后一组连接看起来像“树”。
input
*第1行:两个空间分离的整数:n和m
*行2…m + 1:每行包含三个空间分隔的整数A、B和C,描述成本C的谷仓A和B之间的连接路线。
output
*第1行:一个整数,包含连接所有谷仓的最昂贵的树的价格。如果不可能连接所有谷仓,输出- 1。
这是一个裸的最大生成树 但是初始化的时候不知道为什么要判断a[i][j]<c 自认为多余但是不加就一直交不上去 到现在也不知道为啥 T^T
#include <iostream>
#include<stdio.h>
using namespace std;
#define MAX 99999999
int a[1010][1010];
int Prim(int n)
{
int sum = 0,i,k,time=1,j=1;
int low[1010];
bool flag[1010];
flag[1] = true;
for(i=2; i<=n; i++)
{
low[i] = a[1][i];
flag[i] = false;
}
while(time<=n-1)
{
int minn = -MAX;
for(k=1; k<=n; k++)
if( low[k]> minn && flag[k]==false )
{
minn=low[k];
j=k;
}
if(minn==-MAX)
{
return -1;
}
sum += minn;
flag[j] = true;
for(k = 1; k <=n; k++)
if(a[j][k] > low[k] && flag[k]==false)
low[k] = a[j][k];
time++;
}
return sum;
}
int main()
{
int n,m,i,j,k;
while((scanf("%d %d",&n,&m))!=EOF)
{
for(i=1; i<=n; ++i)
{
for(j=1; j<=n; ++j)
{
if(i==j)
a[i][j]=a[j][j]=0;
else
a[i][j]=a[j][i]=-MAX;
}
}
while(m--)
{
cin>>i>>j>>k;
if(a[i][j]<k)
{
a[i][j]=k;
a[j][i]=k;
}
}
cout<<Prim(n)<<endl;
}
return 0;
}