hdu1863(prim算法)

来源:互联网 发布:阿里云深圳机房 编辑:程序博客网 时间:2024/05/17 20:33
/*made by karen12:00 at Mar.4,2012prim算法求最小生成树奇怪的是Dev c++可以编译但是在Code Blocks里面编译不成功??*/ #include <iostream>#include <cstdio>using namespace std;#define INF 9999999#define MAX_Point 110#define MAX_Edge 12100int arr_list[110][110];struct Edge{    int pointer;    int lowcost;    int flag;}edge[MAX_Edge];int prim(int n){    int i,j,k=1,flag,min,sum2=0;    j=1;    for(i=1;i<=n;i++)    {        if(i!=j)        {            edge[i].pointer=i;            edge[i].lowcost=arr_list[j][i];            edge[i].flag=0;        }    }    edge[j].lowcost=0;    edge[j].flag=1;    for(i=2;i<=n;i++)    {        k=1;        min=INF;        flag=0;        for(j=2;j<=n;j++)        {            if(edge[j].flag==0&&edge[j].lowcost<min)            {                k=j;                min=edge[j].lowcost;                flag=1;            }        }        if(!flag)   return -1;        sum2+=min;        edge[k].flag=1;        for(j=2;j<=n;j++)        {            if(edge[j].flag==0&&arr_list[k][j]<edge[j].lowcost)            {                edge[j].pointer=k;                edge[j].lowcost=arr_list[k][j];            }        }    }        return sum2;}int main(){    int n,m,a,b,c,i,j,sum;    while(scanf("%d%d",&n,&m)!=EOF)    {        if(n==0)    break;        for(i=0;i<110;i++)            for(j=i+1;j<110;j++)                arr_list[i][j]=arr_list[j][i]=INF;        for(i=1;i<=n;i++)        {            scanf("%d%d%d",&a,&b,&c);            if(c<arr_list[a][b])                arr_list[a][b]=arr_list[b][a]=c;                        }        sum=prim(m);        if(sum==-1)            printf("?\n");        else            printf("%d\n",sum);    }    return 0;}

原创粉丝点击