按照Prim算法和Kruscal算法的思想,对下图分别用两种算法进行验证。
kruskal
#include<cstdio> #include<cstdlib> #define MAX 0x7fffffff #define M 30 typedef struct { int data; int jihe; }V; typedef struct { int vexh, vext; int weight; int flag; }E; void minitree_KRUSKAL(void) { int n,i,m,min,k,j; V t[M]; E e[M]; printf("请输入顶点的个数:"); scanf("%d",&n); printf("请输入data "); for(i=0;i<n;i++)//建立点的集合 { scanf("%d",&t[i].data); t[i].jihe=i; } printf("请输入边的条数:"); scanf("%d",&m); printf("请输入vexh,vext,weight: "); for(i=0;i<m;i++)//建立边的集合 { scanf("%d%d%d",&e[i].vexh,&e[i].vext,&e[i].weight); e[i].flag=0; } i=1; while(i<n) { min=MAX; for(j=0;j<m;j++) { if(e[j].weight<min && e[j].flag==0) { min=e[j].weight; k=j; } } if(t[e[k].vexh].jihe!=t[e[k].vext].jihe) { e[k].flag=1; for(j=0;j<n;j++) if(t[j].jihe==t[e[k].vext].jihe) t[j].jihe=t[e[k].vexh].jihe; t[e[k].vext].jihe=t[e[k].vexh].jihe; i++; } else e[k].flag=2; } for(i=0;i<m;i++) if(e[i].flag==1) printf("%d,%d :%d ",e[i].vexh,e[i].vext,e[i].weight); } int main() { minitree_KRUSKAL(); } /* 9 */ /* 14 */ /* 1 2 3 4 5 6 7 8 9 */ /* 1 2 4 1 8 8 2 3 8 2 8 11 3 4 7 3 6 4 3 9 2 4 5 9 4 6 14 5 6 10 6 7 2 7 8 1 7 9 6 8 9 7 */
prime
#include<cstdio> #include<cstdlib> #define MAX 0x7fffffff #define M 30 void Prim(int ad[][M],int n) { int i,j,k,p,q,wm,c; q=p=n-1; ad[q][q]=1; printf("最小生成树为: "); for(k=0;k<(n-1);k++) { wm=MAX; for(i=0;i<n;i++) if(ad[i][i]==1) for(j=0;j<n;j++) if((ad[j][j]==0)&&(ad[i][j]<wm)) { wm=ad[i][j]; p=i; q=j; } ad[q][q]=1; printf("%c %c %d ",(char)p+97,(char)q+97,ad[p][q]); if(p>q) ad[p][q]=-ad[p][q]; else ad[q][p]=-ad[q][p]; } } int main() { int graph[M][M]; int i,j,k,m,n; printf("请输入图中顶点的个数: "); scanf("%d",&n); for(i=0;i<n;i++) { for(j=0;j<n;j++) { scanf("%d",&graph[i][j]); } } Prim(graph,n); return 0; } /* 9 0 4 30 30 30 30 30 8 30 4 0 8 30 30 30 30 11 30 30 8 0 7 30 4 30 30 2 30 30 7 0 9 14 30 30 30 30 30 30 9 0 10 30 30 30 30 30 4 14 10 0 2 30 30 30 30 30 30 30 2 0 1 6 8 11 30 30 30 30 1 0 7 30 30 2 30 30 30 6 7 0 */