最小生成树(一道ACM题目)

  题目是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;
}

 

    

  

posted @ 2012-11-20 19:29  长溪  阅读(501)  评论(2编辑  收藏  举报