这道题虽然一条 边有很多不同的长度,但对于kruskal算法来说,根本没有影响,因为他们都在一个并查集里面,对于prim算法来说,只需加一个判断就可以了,wa了好多次,就是因为那个qsort函数把第一个元素都给排进去了,所以一遍ac记录到此为止了,应该差不多有七八次,最近好像有点不舒服,要感冒了,没事,我会继续学习知识点的
kruskal算法:
#include<stdio.h> #include<stdlib.h> #include<limits.h> int p[55]; int x,y; int sum,ans; typedef struct node { int i,j; int len; }node; node map[3000]; 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() { for(int k=1;k<=y;k++) { int fx=find(map[k].i); int fy=find(map[k].j); if(fx!=fy) { sum+=map[k].len; p[fx]=fy; } } printf("%d\n",sum); } int main() { int i,j,a,b,c; while(scanf("%d",&x),x!=0) { scanf("%d",&y); sum=0; for(i=1;i<=x;i++) p[i]=i; for(i=1;i<=y;i++) { scanf("%d%d%d",&a,&b,&c); map[i].i=a; map[i].j=b; map[i].len=c; } qsort(map+1,y,sizeof(map[1]),cmp); kruskal(); } }
Prim算法,确实已经很熟练了,基本上和前面的模式都是一样的,所以很快就写出来了,最近要开始复习期末考试内容了,不能太多的刷题了,要好好复习,准备考试,争取更高的绩点,这样,如果我想上研究生的话,就不用卖力的复习了,好好努力吧,我相信它不会辜负我的努力的,但是我还会断断续续的刷题,我觉得我都有点上瘾了,刷题好爽的说
Prim算法:
#include<stdio.h> #include<string.h> #include<stdio.h> #include<limits.h> int map[105][105]; int x,y; void prim() { int visit[105],dis[105],sum=0,i,j,now,min; for(i=1;i<=x;i++) dis[i]=INT_MAX; memset(visit,0,sizeof(visit)); now=1,dis[1]=0,visit[1]=1; for(i=1;i<=x;i++) { for(j=1;j<=x;j++) { if(!visit[j]&&dis[j]>map[now][j]) dis[j]=map[now][j]; } min=INT_MAX; for(j=1;j<=x;j++) { if(!visit[j]&&dis[j]<min) min=dis[now=j]; } visit[now]=1; } for(i=1;i<=x;i++) sum+=dis[i]; printf("%d\n",sum); } int main() { int i,j,a,b,c; while(scanf("%d",&x),x!=0) { scanf("%d",&y); for(i=1;i<=x;i++) for(j=1;j<=x;j++) map[i][j]=INT_MAX; for(i=1;i<=y;i++) { scanf("%d%d%d",&a,&b,&c); if(c<map[a][b]) map[a][b]=map[b][a]=c; } prim(); } }