今天突然想到好长时间没有写博客了,这可不是好习惯,囧。。。
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1233
最小生成树
普里母(Prime)算法
#include <stdio.h>
#define INF 1000000
int 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 103
struct 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;
}