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

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

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

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

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

#include <stdio.h>
#include <string.h>
#define typec int // type of cost
const typec inf = 0x3f3f3f3f; // max of cost
#define V 105
int 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));
    }
}


posted @ 2013-07-22 15:05  、小呆  阅读(179)  评论(0编辑  收藏  举报