题目是HDU 4463:Outlets
一道最小生成树的题,开始时一头雾水,数据结构也不懂,自己在那写,觉得这个方法麻烦,那个方法麻烦。。网上搜了下,知道了最小生成树,又对着网上的代码写了点。
其实要是一开始坚定自己的思路写下去,也能写出来的,就是没有信心,数据结构就是把自己的想法写下来。。
一道题目,学到了东西,还是挺开心的~
代码(自己写的prime算法):
View Code
#include<stdio.h> int array[20][20],p,total=0,used[20]; int main() { int r,i,a,b,c; int prim(); printf("input the numbers\nof points and R:\n"); scanf("%d%d",&p,&r); printf("input the details:\n"); for(i=1;i<=r;i++){ scanf("%d%d%d",&a,&b,&c); array[a][b]=array[b][a]=c; } for(i=1;i<=p;i++){ for(a=1;a<=p;a++){ printf("%d ",array[i][a]); } printf("\n"); } printf("%d",prim()); } int prim() { int min=100,i,j,cmpcount; int k; for(i=1;i<=p;i++){ used[i]=0; } used[1]=1; for(cmpcount=1;cmpcount<=p-1;cmpcount++){//total compare times for(i=1;i<=p;i++){//line that have not compared and used[i]=0 for(j=1;j<=p;j++){//line have compared ,used[j]=1 if(!used[i] && used[j] && array[i][j]<min && array[i][j]){ min=array[i][j]; k=i;//k,to change used[x] } } } used[k]=1; total+=min; min=100; } return total; }
后来根据题目改写了代码:
View Code
#include<stdio.h> #include<math.h> typedef struct node{ int x; int y; }myNode; int p,used[20]; float array[20][20],total=0; int main() { int numnike,numapple; int i,j; myNode nodearray[20]; float prim(); printf("input the number of p:\n"); scanf("%d",&p); memset(used,0,sizeof(used)); printf("input the number of nike and apple\n"); scanf("%d%d",&numnike,&numapple); for(i=1;i<=p;i++) scanf("%d%d",&nodearray[i].x,&nodearray[i].y); for(i=1;i<=p;i++){ for(j=1;j<=p;j++){ array[i][j]=sqrt((nodearray[i].x - nodearray[j].x)*(nodearray[i].x - nodearray[j].x) + (nodearray[i].y - nodearray[j].y)*(nodearray[i].y - nodearray[j].y)); } } for(i=1;i<=p;i++){ for(j=1;j<=p;j++){ printf("%f ",array[i][j]); } printf("\n"); } used[numnike]=used[numapple]=1; printf("the total is:%.2f\n",prim()+array[numnike][numapple]); } //annotation is original prim() /* int r,i,a,b,c; int prim(); printf("input the numbers\nof points and R:\n"); scanf("%d%d",&p,&r); printf("input the details:\n"); for(i=1;i<=r;i++){ scanf("%d%d%d",&a,&b,&c); array[a][b]=array[b][a]=c; } for(i=1;i<=p;i++){ for(a=1;a<=p;a++){ printf("%d ",array[i][a]); } printf("\n"); } printf("%d",prim()); } */ float prim() { int i,j,cmpcount; int k; float min=100; for(cmpcount=1;cmpcount<=p-2;cmpcount++){//total compare times for(i=1;i<=p;i++){//line that have not compared and used[i]=0 for(j=1;j<=p;j++){//line have compared ,used[j]=1 if(!used[i] && used[j] && array[i][j]<min && array[i][j]){ min=array[i][j]; k=i;//k,to change used[x] } } } used[k]=1; total+=min; min=100; } return total; }