HDU1863 最小生成树 prim模版

来源:互联网 发布:大人认字软件 编辑:程序博客网 时间:2024/05/20 08:27

prim模版

#include<stdio.h>#include<string.h>#define MAX 0x3f3f3f3fint logo[101];int map[101][101];int dis[101];int n;int prim(){    int i,j,now;    int sum=0;    for(i=1; i<=n; i++)    {        dis[i]=MAX;     //dis初始化为最大值        logo[i]=0;      //logo标记数组初始化为0    }    for(i=1; i<=n; i++)    {        dis[i]=map[1][i];   //以1为起点,能与1连通的用map[1][i]覆盖dis[i]的MAX    }    dis[1]=0;       //与起点的距离为0    logo[1]=1;      //1已经访问过,标记    for(i=1;i<=n;i++)    {        now=MAX;    //now记录最短距离的序号        int min=MAX;    //min记录最短距离的值        for(j=1; j<=n; j++)        {            if(logo[j]==0&&dis[j]<min)     //j未访问且之比当前最小值小            {                now=j;                                min=dis[j];         //更新最短距离的序号和值            }        }        if(now==MAX)    //没被刷新            break;      //跳出循环        logo[now]=1;    //访问now        sum+=min;       //计入和sum        for(j=1; j<=n; j++)        {            if(logo[j]==0&&dis[j]>map[now][j])    //将now加入已访问点,更新与now连通的                dis[j]=map[now][j];        }    }    if(i<n)     //中途break        printf("?\n");    else        printf("%d\n",sum);    return 0;}int main(){    int a,b,c,d,m,i;    while(scanf("%d%d",&m,&n))    {        if(m==0)            break;        memset(map,0x3f3f3f3f,sizeof(map));        for(i=0; i<m; i++)        {            scanf("%d%d%d",&a,&b,&c);       //起点a,终点a,权值c            if(c<map[a][b])                 //出现ab连通有两条路,只记录短的那条                map[a][b]=map[b][a]=c;        }        prim();    }}



原创粉丝点击