基本上已经不用看前面写过的算法了,这两个算法已经基本上熟练了,这次还使用的两种方法做的,
kruskal算法:
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct { int i,j; int len; }node; int ans; node map[10005]; int p[105]; int cmp(const void *a,const void *b) { return ((node*)a)->len-((node*)b)->len; } int find(int x) { return p[x]==x?x:p[x]=find(p[x]); } void kruskal() { int sum=0; for(int i=1;i<ans;i++) { int x=find(map[i].i); int y=find(map[i].j); if(x!=y) { sum+=map[i].len; p[x]=y; } } printf("%d\n",sum); } int main() { int n,i,j,c; while(scanf("%d",&n)!=EOF) { ans=1; memset(map,0,sizeof(map)); memset(p,0,sizeof(p)); for(i=1;i<=n;i++) p[i]=i; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { scanf("%d",&c); if(c!=0) { map[ans].i=i; map[ans].j=j; map[ans++].len=c; } } qsort(map+1,ans-1,sizeof(map[0]),cmp); kruskal(); } }
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<limits.h> int n; int map[105][105]; void prim() { int dis[105],visit[105],sum=0,now,i,j,min; memset(visit,0,sizeof(visit)); for(i=1;i<=n;i++) dis[i]=INT_MAX; dis[1]=0,visit[1]=1,now=1; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(!visit[j]&&dis[j]>map[now][j]) dis[j]=map[now][j]; } min=INT_MAX; for(j=1;j<=n;j++) if(!visit[j]&&dis[j]<min) min=dis[now=j]; visit[now]=1; } for(i=1;i<=n;i++) sum+=dis[i]; printf("%d\n",sum); } int main() { int i,j,c; while(scanf("%d",&n)!=EOF) { memset(map,0,sizeof(map)); for(i=1;i<=n;i++) for(j=1;j<=n;j++) { scanf("%d",&c); if(c!=0) map[i][j]=c; else map[i][j]=INT_MAX; } prim(); } }