HDU1162最小生成树

来源:互联网 发布:tgp腾讯游戏客户端mac 编辑:程序博客网 时间:2024/05/29 16:19

题目大意:图上有n个点,相互连接,求连接的最小费用.

分析:最小生成树算法解决

Kruscal算法:

#include<iostream>#include<algorithm>#include<cstdio>#include<cmath>using namespace std;struct struct_edges{    int bv,tv;    double w;};struct_edges edges[10100];struct struct_a{    double x;    double y;};struct_a arr_xy[105];int point[105],n,e;double sum;int kruscal_f1(int point[],int v){    int i= v;    while(point[i]>0) i=point[i];    return i;}bool UDlesser(struct_edges a,struct_edges b){    return a.w<b.w;}void kruscal(){    int v1,v2,i,j;    for(i=0;i<n;i++) point[i]=0;    i=j=0;    while(j<n-1&&i<e){        v1=kruscal_f1(point,edges[i].bv);        v2=kruscal_f1(point,edges[i].tv);        if(v1!=v2){            sum+=edges[i].w;            point[v1]=v2;            j++;        }        i++;    }}int main(){//    freopen("in.txt","r",stdin);    int k=0,i,j;    while(scanf("%d",&n)!=EOF){        sum=0;        k++;        for(i=0;i<n;i++)            scanf("%lf%lf",&arr_xy[i].x,&arr_xy[i].y);        e=0;        for(i=0;i<n;i++)            for(j=i+1;j<n;j++){                if(i==j) continue;                edges[e].bv=i;                edges[e].tv=j;                edges[e].w=sqrt((arr_xy[i].x-arr_xy[j].x)*(arr_xy[i].x-arr_xy[j].x)+(arr_xy[i].y-arr_xy[j].y)*(arr_xy[i].y-arr_xy[j].y));                e++;            }            sort(edges,edges+e,UDlesser);            kruscal();            printf("%.2lf\n",sum);    }    return 0;}

prim算法:

#include<iostream>#include<cmath>#include<cstdio>using namespace std;double sum,arr_list[105][105],mi;int i,j,k=0,n;struct struct_a{    double x;    double y;};struct_a arr_xy[105];struct struct_b{    int point;    double lowcost;};struct_b dosedge[105];void prim(int n){    int i,j,k;    k=0;    for(j=0;j<n;j++){        if(j!=k){            dosedge[j].point=k;            dosedge[j].lowcost=arr_list[k][j];        }    }    dosedge[k].lowcost=0;    for(i=0;i<n;i++){        mi=10000;        for(j=0;j<n;j++){            if(dosedge[j].lowcost!=0&&dosedge[j].lowcost<mi){                k=j;                mi=dosedge[j].lowcost;            }        }        sum+=dosedge[k].lowcost;        dosedge[k].lowcost=0;        for(j=0;j<n;j++){            if(arr_list[k][j]<dosedge[j].lowcost){                dosedge[j].point=k;                dosedge[j].lowcost=arr_list[k][j];            }        }    }}int main(){//    freopen("in.txt","r",stdin);    while(scanf("%d",&n)!=EOF){        sum=0;        k++;        for(i=0;i<n;i++)            scanf("%lf%lf",&arr_xy[i].x,&arr_xy[i].y);        for(i=0;i<n;i++)            for(j=0;j<n;j++)                arr_list[i][j]=arr_list[j][i]=sqrt((arr_xy[i].x-arr_xy[j].x)*(arr_xy[i].x-arr_xy[j].x)+(arr_xy[i].y-arr_xy[j].y)*(arr_xy[i].y-arr_xy[j].y));        prim(n);        printf("%.2lf\n",sum);    }    return 0;}


0 0
原创粉丝点击