HDU1301(prime + Kruskal)

http://acm.hdu.edu.cn/showproblem.php?pid=1301

prime

#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 30;

int n;
int mp[N][N];
int dis[N];
int vis[N];

int prime(int s)
{
    int sum = 0;

    for(int i = 0;i < n;i ++)
        dis[i] = mp[s][i];

    vis[s] = 1;

    for(int i = 1;i <= n - 1;i ++)
    {
        //  n - 1次迭代
        int minn = inf;
        int p;
        for(int j = 0;j < n;j ++)
        {
            if(!vis[j] && dis[j] < minn)
                minn = dis[j], p = j;
        }

        vis[p] = 1;

        sum += minn;

        for(int j = 0;j < n;j ++)
        {
            if(!vis[j] && dis[j] > mp[p][j])
                dis[j] = mp[p][j];
        }
    }
    return sum;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    while(cin >> n && n)
    {
        memset(mp,inf,sizeof(mp));
        memset(dis,0,sizeof(dis));
        memset(vis,0,sizeof(vis));

        char cc;
        int m;
        for(int i = 1;i < n;i ++)
        {
            cin >> cc >> m;
            int v;
            for(int j = 1;j <= m;j ++)
            {
                cin >> cc >> v;
                mp[i - 1][cc - 'A'] = v;
                mp[cc - 'A'][i - 1] = v;
            }
        }

        cout << prime(0) << '\n';
    }
	return 0;
}

Kruskal

#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 30;
const int M = 100;

struct edge{
    int a, b;
    int v;
};
edge e[M];
int fa[N];
int n;   //n是点数,m是边数

void init()
{
    for(int i = 0;i < N;i ++)
        fa[i] = i;
}

bool cmp(edge a,edge b)
{
    return a.v < b.v;
}

int Find(int x)
{
    if(x != fa[x])
        fa[x] = Find(fa[x]);

    return fa[x];
}

int Merge(int x,int y)
{
    int fx = Find(x);
    int fy = Find(y);

    if(fx != fy)
    {
        fa[fx] = fy;
        return 1;
    }

    return 0;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    while(cin >> n && n)
    {
        init();
        char ch1, ch2;
        int m;

        int se = 0;

        for(int i = 1;i < n;i ++)
        {
            cin >> ch1 >> m;

            int v;

            for(int j = 0;j < m;j ++)
            {
                cin >> ch2 >> v;
                e[se].a = ch1 - 'A';
                e[se].b = ch2 - 'A';
                e[se].v = v;

                se ++;
            }
        }

        sort(e, e + se, cmp);

        int sum = 0;

        for(int i = 0;i < se;i ++)
        {
            if(Merge(e[i].a, e[i].b))
                sum += e[i].v;

        }

        cout << sum << '\n';
    }
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Soul_97/article/details/81631842
今日推荐