SDUT 2144 图结构练习——最小生成树

来源:互联网 发布:颜如玉 知乎 编辑:程序博客网 时间:2024/04/29 23:54

果然复习期间一个题都没敲就是手生了。

一定要记得啊:重复边保存最小的!!!

一开始还是没想到这个,最后忍无可忍动用了模版也没过才想到....

prim算法代码操作就不说了,直接上代码:

#include <stdio.h>#include <string.h>#define typec int // type of costconst typec inf = 0x3f3f3f3f; // max of cost#define V 105int vis[V],dis[V][V];typec lowc[V];typec prim(typec cost[][V], int n) // vertex: 0 ~ n-1{    int i, j, p;    typec minc, res = 0;    memset(vis, 0, sizeof(vis));    vis[0] = 1;    for (i=1; i<n; i++)    {        lowc[i] = cost[0][i];    }    for (i=1; i<n; i++)    {        minc = inf;        p = -1;        for (j=0; j<n; j++)        {            if (0 == vis[j] && minc > lowc[j])            {                minc = lowc[j];                p = j;            }        }        if (inf == minc)        {            return -1; // 原图不连通        }        res += minc;        vis[p] = 1;        for (j=0; j<n; j++)        {            if (0 == vis[j] && lowc[j] > cost[p][j])            {                lowc[j] = cost[p][j];            }        }    }    return res;}int main(){    int m,n,i,j,x,y,w;    while(scanf("%d%d",&n,&m)!=EOF)    {        for(i=0;i<n;i++)        {            for(j=0;j<n;j++)            {                if(i==j)                {                    dis[i][j]=0;                }                else                {                    dis[i][j]=inf;                }            }        }        for(i=0;i<m;i++)        {            scanf("%d%d",&x,&y);            scanf("%d",&w);            if(dis[x-1][y-1]>w)            {                dis[y-1][x-1]=w;                dis[x-1][y-1]=w;            }        }        printf("%d\n",prim(dis,n));    }}


原创粉丝点击