hdu 1233 还是畅通工程(最小生成树,prim,kruskal)

来源:互联网 发布:yessuperstore淘宝 编辑:程序博客网 时间:2024/05/17 06:59

传送门

prim:

#include <stdio.h>#include <string.h>#define INF 99999999int map[101][101];int book[101],dis[101];int main(){    int i,j,k,n,m,t1,t2,t3,count,sum,min;    while(scanf("%d",&n) && n)    {        m = n*(n-1)/2;        count = sum = 0;        memset(book,0,sizeof(book));        for(i = 1; i <= n; ++i)            for(j = 1; j <= n; ++j)                if(i == j) map[i][j] = 0;                else map[i][j] = INF;        for(i = 1; i <= m; ++i)        {            scanf("%d %d %d",&t1,&t2,&t3);            if(t3 < map[t1][t2])                map[t1][t2] = map[t2][t1] = t3;        }        for(i = 1; i <= n; ++i)            dis[i] = map[1][i];        book[1] = 1;        ++count;        while(count < n)        {            min = INF;            for(i = 1; i <= n; ++i)                if(!book[i] && dis[i] < min)                {                    min = dis[i];                    j = i;                }            ++count;            book[j] = 1;            sum += dis[j];            for(k = 1; k <= n; ++k)            {                if(!book[k] && dis[k] > map[j][k])                    dis[k] = map[j][k];            }        }        printf("%d\n",sum);    }    return 0;}

kruskal:

#include <iostream>#include <algorithm>using namespace std;int u[5000],v[5000],w[5000],r[5000];int f[100];int getf(int x){return f[x] == x ? x : (f[x] = getf(f[x]));}int cmp(const int i, const int j) {return w[i] < w[j];}int main(){    int n,m;    while(cin >> n && n)    {        m = n*(n-1)/2;        for(int i = 0; i < m; ++i)            cin >> u[i] >> v[i] >> w[i];        for(int i = 0; i <= n; ++i)            f[i] = i;        for(int i = 0; i < m; ++i)            r[i] = i;        sort(r,r+m,cmp);        int sum = 0;        for(int i = 0; i < m; ++i)        {            int e = r[i];            int x = getf(u[e]);            int y = getf(v[e]);            if(x != y)            {                sum += w[e];                f[x] = y;            }        }        cout << sum << endl;    }    return 0;}


0 0
原创粉丝点击