poj1287

题意:给你n个数,然后m中边的权值,求最小生成树,prime算法和dijkstra算法唯一的不同就是松弛时,prime是求最小邻边,而最短路是求两个点

#include<cstdio>

#include<cstring>

#include<cmath>

#include<vector>

#include<queue>

#include<iostream>

#include<algorithm>

#define maxn 60

#define INF 0x3f3f3f3f


using namespace std;


int map[maxn][maxn];

int d[maxn];

bool vis[maxn];

int n,m;

int a,b,c;

void prime()

{

    for(int i = 1; i <= n; i ++)

    {

        d[i] = map[1][i];

        vis[i] = 0;

    }

    for(int i = 1; i <= n; i ++)

    {

        int minx = INF;

        int now;

        for(int j = 1; j <= n; j ++)

        {

            if(!vis[j] && minx > d[j])

            {

                now = j;

                minx = d[j];

            }

        }

        vis[now] = 1;

        for(int k = 1; k <= n; k ++)

        {

            if(!vis[k] && d[k] > map[now][k])

                d[k] = map[now][k];

        }

    }

    int sum = 0;

    for(int i = 1; i <= n; i ++)

        sum += d[i];

        printf("%d\n",sum);

}

int main()

{

    while(~scanf("%d%d",&n,&m) && n)

    {

        for(int i = 0; i <= n; i ++)

            for(int j = 0; j <= n; j ++)

        {

            if(i != j)

                map[i][j] = INF;

            else map[i][j] = 0;

        }

        for(int k = 1; k <= m; k ++)

       {

          scanf("%d%d%d",&a,&b,&c);

        if(map[a][b] > c)

            map[a][b] = map[b][a] = c;

       }

       prime();

    }


    return 0;

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值