HDU 1233 还是畅通工程

来源:互联网 发布:淘宝比较好的银饰店 编辑:程序博客网 时间:2024/04/29 19:57

链接 : http://acm.hdu.edu.cn/showproblem.php?pid=1233


最小生成树,Prim和Kruskal


Prim:

#include <cstdio>#include <climits>#include <cstring>using namespace std;int map[101][101];bool used[101];int Prim(int n){    int sum=0;    int mini,t,T=n-1;    while(T--)    {        mini=INT_MAX;        for(int i=2; i<=n; i++)            if(!used[i] && mini>map[1][i])            {                t=i;                mini=map[1][i];            }        used[t]=1;        sum+=mini;        for(int i=2; i<=n; i++)            if(!used[i] && map[1][i]>map[t][i])                map[1][i]=map[t][i];    }    return sum;}int main(){    int n;    while(~scanf("%d",&n),n)    {        int i,j,dis,T=n*(n-1)/2;        memset(map,INT_MAX,sizeof(map));        while(T--)        {            scanf("%d %d %d",&i,&j,&dis);            map[i][j]=map[j][i]=dis;        }        memset(used,0,sizeof(used));        printf("%d\n",Prim(n));    }    return 0;}

Kruskal:

#include <cstdio>#include <algorithm>using namespace std;struct node{    int b,e,dis;} s[5000];int n,m,father[101];bool cmp(node a,node b){    return a.dis < b.dis;}int find(int x){    return father[x]==x ? x : father[x]=find(father[x]);}int main(){    while(scanf("%d",&n),n)    {        m=n*(n-1)/2;        for(int i=0; i<101; i++) father[i]=i;        for(int i=0; i<m; i++) scanf("%d %d %d",&s[i].b,&s[i].e,&s[i].dis);        sort(s,s+m,cmp);        int sum=0;        for(int i=0; i<m; i++)        {            int x=find(s[i].b);            int y=find(s[i].e);            if(x!=y)            {                father[y]=x;                sum+=s[i].dis;            }        }        printf("%d\n",sum);    }    return 0;}


0 0
原创粉丝点击