HDU -- 1233 还是畅通工程(mst)

来源:互联网 发布:程序员发展前景 编辑:程序博客网 时间:2024/06/05 17:27

题目大意:给出村庄数目n,及n*(n-1)/2条道路,求连通所有村庄的最小花费。

代码实现:prim

#include<stdio.h>#include<string.h>int n,p[110][110],visit[110],dis[110];void Prim(){    int k,sum=0,mincost;    memset(visit,0,sizeof(visit));    for(int i=1;i<=n;i++)       dis[i]=p[1][i];    visit[1]=1;    for(int i=1;i<n;i++){        mincost=1e9,k=-1;        for(int j=1;j<=n;j++){            if(visit[j]==0&&dis[j]<mincost){                k=j;                mincost=dis[j];            }        }        if(k==-1) break;        visit[k]=1;        sum+=mincost;        for(int j=1;j<=n;j++){            if(visit[j]==0&&dis[j]>p[k][j])                dis[j]=p[k][j];        }    }    printf("%d\n",sum);}int main(){    while(~scanf("%d",&n),n){        for(int i=1;i<=n;i++){            for(int j=1;j<=n;j++)                p[i][j]=1e9;        }        int a,b,c;        for(int i=0;i<n*(n-1)/2;i++){            scanf("%d%d%d",&a,&b,&c);            p[a][b]=p[b][a]=c;        }        Prim();    }    return 0;}
Kruskal:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=4950;int fa[102];int n,m;struct Node{    int v1,v2,val;}edge[maxn];int cmp(Node a,Node b){    return a.val<b.val;}int Find(int a){    return (a==fa[a])?fa[a]:Find(fa[a]);}void Merge(int a,int b){    int x=Find(a);    int y=Find(b);    fa[y]=x;}void kruskal(){    for(int i=1;i<=n;i++)        fa[i]=i;    int i,j,sum=0;    for(i=0,j=0;i<n-1&&j<m;j++){        if(Find(edge[j].v1)==Find(edge[j].v2)) continue;        Merge(edge[j].v1,edge[j].v2);        sum+=edge[j].val;        i++;    }    printf("%d\n",sum);}int main(){    while(~scanf("%d",&n),n){        m=n*(n-1)/2;        for(int i=0;i<m;i++)            scanf("%d%d%d",&edge[i].v1,&edge[i].v2,&edge[i].val);        sort(edge,edge+m,cmp);        kruskal();    }}



0 0