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

来源:互联网 发布:matlab编程实例 编辑:程序博客网 时间:2024/05/17 00:58

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

Time Limit: 1000MS Memory Limit: 65536KB


Problem Description


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

Input


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

Output


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

Example Input


3 2
1 2 1
1 3 1
1 0

Example Output


2
0

Submit


#include <bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3fconst int MAXN = 105;int mp[MAXN][MAXN];bool visit[MAXN];int dist[MAXN];void prim(int N)//算出每个城镇到其他城镇的最短路{    int i, j, k;    int Min;    int sum = 0;    for(i = 1; i <= N; i++)        dist[i] = mp[1][i];    visit[1] = 1;    for(i = 2; i <= N; i++)    {        Min = INF;        for(j = 1; j <= N; j++)        {            if(dist[j] < Min && !visit[j])            {                k = j;                Min = dist[j];            }        }        visit[k] = 1;        sum += Min;        for(j = 1; j <= N; j++)            if(mp[k][j] < dist[j] && !visit[j])                dist[j] = mp[k][j];    }    printf("%d\n", sum);}int main(){    int N, M;    while(~scanf("%d %d", &N, &M))    {        if(M < N - 1)        {            printf("0\n");            continue;        }        memset(mp, INF, sizeof(mp));        memset(visit, 0, sizeof(visit));        memset(dist, INF, sizeof(dist));        for(int i = 1; i <= N; i++)            mp[i][i] = 0;        while(M--)        {            int u, v, w;            scanf("%d %d %d", &u, &v, &w);            if(w < mp[u][v])                mp[u][v] = mp[v][u] = w;        }        prim(N);    }    return 0;}
0 0