求最小树,map[][]初始都为MAX
求最大树,map[][]初始都为0,prim函数再改下就ok了
判断全树是通过判断顶点是否都遍历了,即use[]1到n是否都为1
View Code
#include<stdio.h>
#define MAX 0x3fffffff
int map[1005][1005],dis[1005];
bool use[1005];
int n,m;
void prim(int start)
{
int max,rj,i,j,add;
for(j=1;j<=n;j++)
{
dis[j]=map[1][j];
use[j]=0;
}
use[1]=1;
add=0;
for(i=1;i<n;i++)
{
max=0;
for(j=1;j<=n;j++)
{
if(use[j]==1)continue;
if(dis[j]>max)
{
max=dis[j];
rj=j;
}
}
use[rj]=1;
add+=max;
for(j=1;j<=n;j++)
{
if(use[j]==1)continue;
if(dis[j]<map[rj][j])
dis[j]=map[rj][j];
}
}
for(i=1;i<=n;i++)//判断全树是否形成
{
if(use[i]==0)
break;
}
if(i==n+1)
printf("%d\n",add);
else
printf("-1\n");
}
int main()
{
int i,j,a,b,temp;
while(scanf("%d",&n)!=EOF)
{
scanf("%d",&m);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
map[i][j]=0;
}
}
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
scanf("%d",&temp);
if(temp>map[a][b])
{
map[b][a]=temp;
map[a][b]=temp;//重边的情况,加着总没错
}
}
prim(1);
}
}