这题是科大初赛的一道题,但是弱得一逼的我居然这么裸的都没做出来,边太多,kruskal 果断超时,prim上场
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<queue>
#include<vector>
#define max 100000
#define min -10000
using namespace std;
int g[1010][1010],flag[1010],dist[1010],p[1010];
int sum1=0,sum2=0;
int minprim(int n)
{
int i,j,t;
sum1=0;
memset(flag,0,sizeof(flag));
memset(dist,0,sizeof(dist));
for(i=1;i<=n;i++)
{
g[i][i]=max;
}
for(i=1;i<=n;i++)
dist[i]=g[1][i];
flag[1]=1;
for(i=2;i<=n;i++)
{
int temp=max;
for(j=1;j<=n;j++)
{
if(!flag[j]&&dist[j]<temp)
{
temp=dist[j];
t=j;
}
}
flag[t]=1;
sum1+=temp;
for(j=1;j<=n;j++)
{
if(dist[j]>g[t][j])
dist[j]=g[t][j];
}
}
return sum1;
}
int maxprim(int n)
{
int i,j,t;
sum2=0;
memset(flag,0,sizeof(flag));
memset(dist,0,sizeof(dist));
for(i=1;i<=n;i++)
{
g[i][i]=min;
}
for(i=1;i<=n;i++)
dist[i]=g[1][i];
flag[1]=1;
for(i=2;i<=n;i++)
{
int temp=min;
for(j=1;j<=n;j++)
{
if(!flag[j]&&dist[j]>temp)
{
temp=dist[j];
t=j;
}
}
flag[t]=1;
sum2+=temp;
for(j=1;j<=n;j++)
{
if(dist[j]<g[t][j])
dist[j]=g[t][j];
}
}
return sum2;
}
int main()
{
int T;
int k;
scanf("%d",&T);
for(k=1;k<=T;k++)
{
int n;
scanf("%d",&n);
int i,j;
memset(g,0,sizeof(g));
memset(p,0,sizeof(p));
for(i=1;i<=n;i++)
{
scanf("%d",&p[i]);
}
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
g[j][i]=g[i][j]=abs(p[i]-p[j]);
}
}
printf("Case #%d: %d %d\n",k,minprim(n),maxprim(n));
}
return 0;
}