CSDN-CSDN社区-C/C++-C语言

收藏 300分求kruskal算法实现源代码![问题点数:100,结帖人:q198816]

  • q198816
  • (有了目标,就不再迷茫,linu)
  • 等 级:
  • 结帖率:
楼主发表于:2008-07-16 10:06:09
请给出KRUSKAL算法的源代码,切记得通用性。
没通用性的算法就别发了。
我每天看帖,得到结果当天结贴,并且第二天发2个100分帖子记得进来接分就是
回复次数:14
  • q198816用户头像
  • q198816
  • (有了目标,就不再迷茫,linu)
  • 等 级:
#1楼 得分:0回复于:2008-07-16 10:18:09
在废话2句
图是连通图(可能是有向图,也可能是无向图,也有可能图是由单项边和无向边组成的!)
  • xkyx_cn用户头像
  • xkyx_cn
  • (飞翔的鱼)
  • 等 级:
  • 2

#2楼 得分:0回复于:2008-07-16 10:19:52
请说明一下你说的“通用性”
#3楼 得分:100回复于:2008-07-16 10:20:21
  • q198816用户头像
  • q198816
  • (有了目标,就不再迷茫,linu)
  • 等 级:
#4楼 得分:0回复于:2008-07-16 17:11:07
麻烦加点注释可以不。我看程序好快些啥
在DEVC++编译过不去,我也好改下啥。
  • q198816用户头像
  • q198816
  • (有了目标,就不再迷茫,linu)
  • 等 级:
#5楼 得分:0回复于:2008-07-16 17:15:47
饿。。。编译过了。
麻烦大侠程序加点注释啊谢谢。
讲下程序大概思路。
  • q198816用户头像
  • q198816
  • (有了目标,就不再迷茫,linu)
  • 等 级:
#6楼 得分:0回复于:2008-07-16 17:24:09
。。。。。。大侠。。。我对着金山词霸看你的printf还是看不太懂啊。。解释下吧多。
为了这300分。。。。

Please input the right between vertex %d and vertex %d,if no edge exists please input -1:

请输入第一个最高点,和第2个最高点。如果这2个点,之间是无向的只输入-1?

#7楼 得分:0回复于:2008-07-16 21:04:15
vertex 是顶点的意思吧
#8楼 得分:0回复于:2008-07-16 21:22:27
学习。。。。
#9楼 得分:0回复于:2008-07-17 02:12:28
到这去找找就好了www.koders.com
  • jillnicky用户头像
  • jillnicky
  • (吉尔(TUXEDO插一脚去))
  • 等 级:
  • 2

#10楼 得分:0回复于:2008-07-17 08:53:08
数据结构书里不是都有吗?????
#11楼 得分:0回复于:2008-07-17 09:24:42
引用 10 楼 jillnicky 的回复:
数据结构书里不是都有吗?????
#12楼 得分:0回复于:2008-07-17 09:26:26
C/C++ code
//Kruskal.c #include "stdio.h" #define maxver 10 #define maxright 100 int G[maxver][maxver],record=0,touched[maxver][maxver]; int circle=0; int FindCircle(int,int,int,int); int main() { int path[maxver][2],used[maxver][maxver]; int i,j,k,t,min=maxright,exsit=0; int v1,v2,num,temp,status=0; restart: printf("Please enter the number of vertex(s) in the graph:\n"); scanf("%d",&num); if(num>maxver||num<0) { printf("Error!Please reinput!\n"); goto restart; } for(j=0;j<num;j++) for(k=0;k<num;k++) { if(j==k) { G[j][k]=maxright; used[j][k]=1; touched[j][k]=0; } else if(j<k) { re: printf("Please input the right between vertex %d and vertex %d,if no edge exists please input -1:\n",j+1,k+1); scanf("%d",&temp); if(temp>=maxright||temp<-1) { printf("Invalid input!\n"); goto re; } if(temp==-1) temp=maxright; G[j][k]=G[k][j]=temp; used[j][k]=used[k][j]=0; touched[j][k]=touched[k][j]=0; } } for(j=0;j<num;j++) { path[j][0]=0; path[j][1]=0; } for(j=0;j<num;j++) { status=0; for(k=0;k<num;k++) if(G[j][k]<maxright) { status=1; break; } if(status==0) break; } for(i=0;i<num-1&&status;i++) { for(j=0;j<num;j++) for(k=0;k<num;k++) if(G[j][k]<min&&!used[j][k]) { v1=j; v2=k; min=G[j][k]; } if(!used[v1][v2]) { used[v1][v2]=1; used[v2][v1]=1; touched[v1][v2]=1; touched[v2][v1]=1; path[i][0]=v1; path[i][1]=v2; for(t=0;t<record;t++) FindCircle(path[t][0],path[t][0],num,path[t][0]); if(circle) {/*if a circle exsits,roll back*/ circle=0; i--; exsit=0; touched[v1][v2]=0; touched[v2][v1]=0; min=maxright; } else { record++; min=maxright; } } } if(!status) printf("We cannot deal with it because the graph is not connected!\n"); else { for(i=0;i<num-1;i++) printf("Path %d:vertex %d to vertex %d\n",i+1,path[i][0]+1,path[i][1]+1); } return 1; } int FindCircle(int start,int begin,int times,int pre) { /* to judge whether a circle is produced*/ int i; for(i=0;i<times;i++) if(touched[begin][i]==1) { if(i==start&&pre!=start) { circle=1; return 1; break; } else if(pre!=i) FindCircle(start,i,times,begin); else continue; } return 1; }


http://blog.csdn.net/ctu_85/archive/2006/12/16/1445147.aspx
  • q198816用户头像
  • q198816
  • (有了目标,就不再迷茫,linu)
  • 等 级:
#13楼 得分:0回复于:2008-07-17 13:22:56
连发3贴终于可以在说话了。。。。
数据结构的书我有2本。
一本只讲PRIM,
还有一本,,中文的算法描述有,但是他给的代码完全是自我YY。


3楼的朋友代码我测试了,还是没有通用性,就个正方形,4个顶点4条边,3条边无向,一条边有向,问题就来了,再加上没有注释我就不看了。
等待大侠给出源代码
  • q198816用户头像
  • q198816
  • (有了目标,就不再迷茫,linu)
  • 等 级:
#14楼 得分:0回复于:2008-07-17 13:44:05
真是郁闷了,这个算法,我找了好几个程序了,难道kruskal算法只能处理无向连通图?
                                         
相关问题
kruskal和prim算法问题专题开发/技术/项目/ 数据结构与算法- CSDN社区 ...
请教Prim算法和Dijkstra算法的问题。。。。 专题开发/技术/项目/ 数据 ...
发布算法源码专题开发/技术/项目/ 数据结构与算法- CSDN社区community ...
软件设计师考试知识点总结