HDU-#1233 还是畅通工程(Prim & Kruskal)

来源:互联网 发布:网络教育培训加盟 编辑:程序博客网 时间:2024/05/16 11:53

题目大意:中文题目,并且是畅通工程的第三个版本不解释了,就是一道MST问题。

解题思路:很裸的一道MST,上一题的1102给出了详细的说明这里就不给出来了,发现这种题目最容易出错的是下标的控制,还是没有理解透彻,不能够灵活运用呀。

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1233

Prim code:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MAXN = 105;const int INF =0x3fffffff;int n,a,b,c;int map[MAXN][MAXN],vis[MAXN],dist[MAXN];int Prim(){    int sum=0;    for(int i=1;i<=n;i++) dist[i]=(i==1?0:map[1][i]);    memset(vis,0,sizeof(vis));    vis[1]=1;    for(int i=1;i<n;i++){        int pos,minn=INF;        for(int j=1;j<=n;j++) if(!vis[j] && dist[j]<minn) minn=dist[pos=j];        vis[pos]=1;        sum+=minn;        for(int k=1;k<=n;k++)            if(!vis[k] && dist[k]>map[pos][k])                dist[k]=map[pos][k];    }    return sum;}int main(){    while(scanf("%d",&n)!=EOF && n){        for(int i=0;i<n;i++)            for(int j=0;j<n;j++)                map[i][j]=INF;        for(int i=1;i<=n*(n-1)/2;i++){            scanf("%d%d%d",&a,&b,&c);            map[a][b]=map[b][a]=c;        }        int ans=Prim();        printf("%d\n",ans);    }    return 0;}

Kruskal code:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXN =100+10;int n,tmp;int p[MAXN];struct edge{    int u,v,w;}e[MAXN*MAXN];int cmp(const edge a,const edge b){return a.w<b.w;}int find(int x){return x==p[x]?x:find(p[x]);}int Kruskal(){    int ans=0;    for(int i=1;i<=n;i++) p[i]=i;    sort(e+1,e+1+tmp,cmp);    for(int i=1;i<=tmp;i++){        int x=find(e[i].u);        int y=find(e[i].v);        if(x!=y){            p[x]=y;            ans+=e[i].w;        }    }    return ans;}int main(){    while(scanf("%d",&n)!=EOF && n){        tmp=n*(n-1)/2;        for(int i=1;i<=tmp;i++)            scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);        int ans=Kruskal();        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击