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

来源:互联网 发布:英雄连2 单位数据 编辑:程序博客网 时间:2024/05/21 09:45

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

Input

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

Output

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

Example Input

3 21 2 11 3 11 0

Example Output

20
#include<bits/stdc++.h>#define inf 0x3f3f3f3f//无穷大using namespace std;int visit[1000];//初始值为零int p[1000][1000];//图数组int low[1000];int n, m, u, v, c, k;int sum;void prim(){    visit[1] = 1;    int i, j;    for(i = 1; i <= n; i ++)    {        low[i] = p[1][i];    }    for(i = 2; i <= n; i ++)    {        int min = inf;        for(j = 1; j <= n; j ++)        {            if(! visit[j] && low[j] < min)            {                min = low[j];                k = j;            }        }        visit[k] = 1;        sum = sum + min;        for(j = 1; j <= n; j ++)        {            if(! visit[j] && low[j] > p[k][j])            {                low[j] = p[k][j];            }        }    }}int main(){    int i;    while(cin >>n>>m)    {        memset(visit,0,sizeof(visit));        memset(p,inf,sizeof(p));        sum = 0;        for(i = 0; i < m; i ++)        {            cin >>u>>v>>c;            if(p[u][v] > c)            {                p[u][v] = p[v][u] = c;            }        }        prim();        cout <<sum<<endl;    }    return 0;}
0 0