数据结构实验之图论九:最小生成树

来源:互联网 发布:人工智能 语音唤醒 编辑:程序博客网 时间:2024/06/13 21:48

数据结构实验之图论九:最小生成树

Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic

Problem Description

 有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

Hint

方法一:
#include<bits/stdc++.h> using namespace std; #define Max 0x3f3f3f3f int n, m, s; int vis[101], dis[101]; int a[101][101]; void prim() {     int ml, k, i, j;     vis[1] = 1;     for(i = 2; i <= n; i++)        dis[i] = a[i][1];     for(i = 1; i < n; i++)     {         ml = Max;         for(j = 1; j <= n; j++)         {             if(!vis[j]&&ml>dis[j])             {                 ml = dis[j];                 k = j;             }         }         s += ml;         vis[k] = 1;         for(j = 2; j <= n; j++)         {             if(!vis[j]&&a[j][k]<dis[j])                {                    dis[j] = a[j][k];                }         }     } } int main() {     int x, y, c, i;     while(~scanf("%d%d", &n, &m))     {         s = 0;         if(m<n-1)         {             cout<<"0"<<endl;             continue;         }         memset(a, Max, sizeof(a));         memset(vis, 0, sizeof(vis));         for(i = 1; i <= n; i++)            a[i][i] = 0;         for(i = 0; i < m; i++)         {             cin>>x>>y>>c;         if(a[x][y]>c)             a[x][y] = a[y][x] = c;         }         prim();         cout<<s<<endl;     } } 
方法二:并查集
#include<bits/stdc++.h>using namespace std;int n, m, dis[1100], num;struct st{    int a, b, c;}s[10001];bool cmp(st p, st q){    return p.c<q.c;}int Find(int x){    return dis[x] == x ? x : Find(dis[x]);}int kruskal(){    int x, y, i, k;    k = 0;    for(i = 0; i < m; i++)    {        x = Find(s[i].a);        y = Find(s[i].b);        if(x!=y)        {            dis[x] = y;            num += s[i].c;            k++;        }        if(k==n-1) break;    }    /*for(i = 1; i <= n; i++)    {        if(dis[i]==i)            k++;    }*/    if(k==n-1) return 1;    else return 0;}int main(){    int i, k;    while(~scanf("%d%d", &n, &m))    {        num = 0;        for(i = 0; i < m; i++)        {            scanf("%d%d%d", &s[i].a, &s[i].b, &s[i].c);        }        for(i = 0; i<= n; i++)            dis[i] = i;        sort(s, s+m, cmp);        k = kruskal();        if(k)        cout<<num<<endl;        else cout<<0<<endl;    }}


 
阅读全文
0 0