hdu 1233 最小生成树

来源:互联网 发布:深圳市的企业数据库 编辑:程序博客网 时间:2024/05/17 07:42

今天突然想到好长时间没有写博客了,这可不是好习惯,囧。。。

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

最小生成树

普里母(Prime)算法

#include <stdio.h>#define INF 1000000int map[104][104],n;int dis[104];int Prim(){int i,j,cost=0;dis[0]=0;for(i=1;i<n;i++)         dis[i]=map[0][i];for(i=1;i<n;i++){   int min = INF,choose=0;   for(j=1;j<n;j++)   {    if(dis[j]&&dis[j]<min)    {     min = dis[j];     choose= j;    }   }   cost += dis[choose];   dis[j] = 0;   for(j=1;j<n;j++)   {    if(dis[j]&&dis[j]>map[choose][j])    dis[j]=map[choose][j];   }}return cost;}int main(void){int i,x,y;while(scanf("%d",&n),n){   for(i=0;i<n*(n-1)/2;i++)   {    scanf("%d%d",&x,&y);    scanf("%d",&map[x-1][y-1]);   map[y-1][x-1]=map[x-1][y-1];   }   printf("%d\n",Prim());}return 0;}


克鲁斯卡尔

还是克鲁斯卡尔算法好懂易实现 同时给严蔚敏老师跪了看她的视频收获大大的

#include <stdio.h>#include <stdlib.h>#define M 10000#define N 103struct edge{     int u,v,w;}e[M];int set[N],n,m;int cmp(const void *a,const void *b){     return ((struct edge*)a)->w - ((struct edge*)b)->w;}int find(int x){     int a;     a=x;     while(set[a]!=a)     {         a=set[a];     }     return a;    }int kruskal(){     int i,ans=0;     for (i=1;i<=n;i++) set[i]=i;     qsort(e+1,m,sizeof(e[0]),cmp);     for (i=1;i<=m;i++)     {         int x=find(e[i].u);         int y=find(e[i].v);         if (x!=y) {ans+=e[i].w; set[x]=y;}     }     return ans;}int main(){     int i;     while (scanf("%d",&n) && n)     {         m=n*(n-1)/2;         for ( i=1;i<=m;i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);         printf("%d\n",kruskal());     }     return 0;}


 

 

原创粉丝点击