CSP考試 2014年12月第4題 最優灌溉 C語言實現
阿新 • • 發佈:2019-01-09
#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; }