数据结构之 图论---最小生成树(prim + kruskal)

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

Time Limit: 1000MS Memory limit: 65536K

题目描述

 有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。
 

输入

 输入包含多组数据,格式如下。
第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n<=100)
剩下m行每行3个正整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c。
 

输出

 每组输出占一行,仅输出最小花费。

示例输入

3 2
1 2 1
1 3 1
1 0

示例输出

2
0
#include <iostream>
#include <string>
#include <stdio.h>
#include <string.h>
#define INF 99999999

using namespace std;
int sum;
int map[110][110];
int cost[110];
bool vis[110];

void prim(int n)   //普利姆 最小生成树算法实现
{
    sum=0;
    int i, j, pos, mincost;

    memset(vis, false, sizeof(vis));
    for(i=1; i<=n; i++)
    {
        cost[i]=map[1][i];
    }
    vis[1]=true;
    for(i=1; i<n; i++)
    {
        mincost=INF;
        for(j=1; j<=n; j++)
        {
            if(!vis[j] && mincost>cost[j] )
            {
                mincost=cost[j];
                pos=j;
            }
        }
        vis[pos]=true;
        sum+=cost[pos];
        for(j=1; j<=n; j++)
        {
            if(!vis[j] && map[pos][j]<cost[j] )
            {
                cost[j]=map[pos][j];
            }
        }
    }
}

int main()
{
    int n, m;
    int i, j;
    int u, v, w;
    while(cin>>n>>m)
    {
        for(i=0; i<=n; i++)
        {
            for(j=0; j<=n; j++)
            {
                map[i][j]=INF;
            }
        }
        for(i=0; i<m; i++)
        {
            cin>>u>>v>>w;
            if(map[u][v] > w)
            {
                map[u][v]=w;
                map[v][u]=w;
            }
        }
        prim(n);
        cout<<sum<<endl;
    }
    return 0;
}

 



posted @ 2014-11-12 21:27  我喜欢旅行  阅读(334)  评论(0编辑  收藏  举报