#include <stdio.h>
#include <stdlib.h>
//#include <string.h>
//最小生成树
//C算法 图算法 第20章 最小生成树
//先排序
//用c语言自带的快速排序程序 qsort
//排序是瓶颈
//正确 100
// 8 12
// 1 7 51
// 1 2 32
// 1 3 29
// 5 4 34
// 6 4 18
// 8 5 46
// 6 5 40
// 1 6 60
// 7 5 51
// 8 1 31
// 8 7 25
// 8 2 21
// 204
struct hello{
int c;//对c排序
int a;
int b;
};
int compare(const void* a,const void* b)
{
return *(int*)a-*(int*)b;//重要
}
int main()
{
int NUM1;
int NUM2;
scanf("%d",&NUM1);
scanf("%d",&NUM2);
int sl[NUM1];//散列表
//memset(sl,0,sizeof(sl));//-10
struct hello pp[NUM2];
int i;
for(i=0;i<NUM2;i++)
{
scanf("%d",&pp[i].a);
scanf("%d",&pp[i].b);
scanf("%d",&pp[i].c);
}
qsort(pp,NUM2,sizeof(struct hello),compare);//c语言自带的快速排序程序
/*
int j;
for(i=0;i<NUM2;i++)//先排序
{
struct hello min=pp[i];
int hi=i;
for(j=i+1;j<NUM2;j++)
{
if(min.c>pp[j].c)
{
min=pp[j];
hi=j;
}
}
pp[hi]=pp[i];
pp[i]=min;
}*/
for(i=0;i<NUM1;i++)
{
sl[i]=0;
}
sl[0]=1;
int t;//计数
int kaoshi=0;
for(t=1;t<NUM1;t++)
{
int min=-1;
int hi=-1;//与min联用
//int ti=-1;
for(i=0;i<NUM2;i++)
{
//if(color[i]==0)
{
if((sl[pp[i].a-1]==1)&&(sl[pp[i].b-1]==0))
{
/*
if(min==-1)
{
min=pp[i].c;
hi=pp[i].b;
}else if(min!=-1)
{
if(min>pp[i].c)
{
min=pp[i].c;
hi=pp[i].b;
}
}*/
//if((min==-1)||(min>pp[i].c))//+0
{
min=pp[i].c;
hi=pp[i].b;
break;
//ti=i;
}
}else if((sl[pp[i].a-1]==0)&&(sl[pp[i].b-1]==1))
{
/*
if(min==-1)
{
min=pp[i].c;
hi=pp[i].a;
}else if(min!=-1)
{
if(min>pp[i].c)
{
min=pp[i].c;
hi=pp[i].a;
}
}*/
//if((min==-1)||(min>pp[i].c))
{
min=pp[i].c;
hi=pp[i].a;
break;
//ti=i;
}
}
}
}
//printf("hi %d min %d\n",hi,min);
//color[ti]=1;
sl[hi-1]=1;
kaoshi=kaoshi+min;
//printf("kaoshi %d\n",kaoshi);
}
printf("%d",kaoshi);
/*
printf("\n%d %d\n",NUM1,NUM2);
for(i=0;i<NUM2;i++)
{
printf("%d %d %d\n",pp[i].a,pp[i].b,pp[i].c);
}*/
return 0;
}
CSP考试 2014年12月第4题 最优灌溉 C语言实现
最新推荐文章于 2023-03-23 19:54:07 发布