谁能帮我写下这个程序的流程图啊`````急用`````望高手多多帮忙谢谢!

 
#include  "stdafx.h"
#include   <stdio.h>  
#include   <iostream.h>  
#include   <stdlib.h>
#include   <iomanip.h>  
 
const   int   MaxVertexNum=30;  
const   int   MaxValue=50;       // 最大权值  
typedef   int   VertexType;     // 顶点信息类型为整型  
typedef   VertexType   vexlist[MaxVertexNum];  
typedef   int   adjmatrix[MaxVertexNum][MaxVertexNum];// 邻接矩阵  
struct   edge{ // 边结构  
       int   fromvex; // 起点  
       int   endvex; // 终点  
       int   weight;// 权值   
};  
struct   edgenode{// 边结点  
       int   adjvex;  
       edgenode   *next;// 指向边结点的指针  
};  
void   CreateAM(adjmatrix   &GA,int   n,int   e)   // 为普里姆算法构造无向图  
{    
       vexlist   GV;  
       int   i,j,k,w;  
       cout<<" 输入"<<n<<" 个顶点:( 之间用空格隔开)"<<endl;  
       for(i=0;i<n;i++)  
              cin>>GV[i];// 输入顶点的个数  
       for(i=0;i<n;i++)  
              for(j=0;j<n;j++){  
                     if(i==j)   GA[i][j]=0;  
                     else    
                            GA[i][j]=MaxValue;// 把权值初始化为最大权值  
              }  
              cout<<" 输入"<<e<<" 条边:( 格式:fromvex   endvex   weight)"<<endl;  
              for(k=0;k<e;k++){ // 输入边  
                     cout<<" 输入第"<<k+1<<" 条边:";  
                     cin>>i>>j>>w;  
                     GA[i][j]=GA[j][i]=w;// 此图为无向图, 对称权值相等  
              }  
}  
 
edge   *CreateES(int   n,int   e)   // 为克鲁斯卡尔算法构造无向图  
{  
       int   i,j,k,w;  
       vexlist   GV;  
       cout<<" 输入"<<n<<" 个顶点:( 之间用空格隔开)"<<endl;  
       for(i=0;i<n;i++)  
              cin>>GV[i];  
       cout<<" 输入"<<e<<" 条边:( 格式:fromvex   endvex   weight)"<<endl;  
       edge   *GE=(edge   *)malloc(e*sizeof(edge));    
       for(k=0;k<e;k++){  
              cout<<" 输入第"<<k+1<<" 条边:";  
              cin>>i>>j>>w;  
              GE[k].fromvex=i;  
              GE[k].endvex=j;   
              GE[k].weight=w;  
       }  
       return   GE;  
}  
 
edge   *SortGE(edge   *GE,int   e)// 按权值的大小排序  
{  
       int   i,j,flag;  
       edge   temp;  
       for(i=0;i<e;i++)  
       {  
              flag=0;  
              for(j=e-1;j>=i;j--)  
                     if(GE[j-1].weight>GE[j].weight)
                     {  
                            temp=GE[j-1];  
                            GE[j-1]=GE[j];  
                            GE[j]=temp;  
                            flag=1;  
                     }  
                     if(flag==0)    
                            return   GE;  
       }  
}  
 
edge   *Kruskal(edge   *GE,int   n,int   e)// 用克鲁斯尔算法求最小生成树  
{  
       int   i,j;  
       adjmatrix   s;  
       for(i=0;i<n;i++)  
       {  
              for(j=0;j<n;j++)  
                     if(i==j)   s[i][j]=1;  
                     else    
                            s[i][j]=0;  
       }  
       int   k(1),d(0),m1,m2;  
       edge   *C=new   edge[n-1];    
       for(i=0;i<n-1;i++)    
              C[i].fromvex=C[i].endvex=C[i].weight=0;  
       while(k<n)  
       {  
              for(i=0;i<n;i++)  
              {  
                     for(j=0;j<n;j++)
                     {  
                            if(GE[d].fromvex==j&&s[i][j]==1)   m1=i;  
                            if(GE[d].endvex==j&&s[i][j]==1)   m2=i;  
                     }  
              }  
              if(m1!=m2)  
              {  
                     C[k-1]=GE[d];  
                     k++;  
                     for(j=0;j<n;j++)  
                     {  
                            s[m1][j]=s[m1][j]||s[m2][j];  
                            s[m2][j]=0;  
                     }  
              }  
              d++;  
       }  
       return   C;  
}  
 
edge   *Prim(adjmatrix   GA,int   n)// 用普里姆算法求最小生成树  
{  
       int   i,j,k,min,t,m,w;  
       edge   *CT=new   edge[n-1];  
       for(i=0;i<n-1;i++)  
       {  
              CT[i].fromvex=0;   
              CT[i].endvex=i+1;  
              CT[i].weight=GA[0][i+1];  
       }  
       for(k=1;k<n;k++)  
       {  
              min=MaxValue;  
              m=k-1;  
              for(j=k-1;j<n-1;j++)  
                     if(CT[j].weight<min)
                     {  
                            min=CT[j].weight;  
                            m=j;  
                     }  
                     edge   temp=CT[k-1];  
                     CT[k-1]=CT[m];  
                     CT[m]=temp;  
                     j=CT[k-1].endvex;  
                     for(i=k;i<n-1;i++)  
                     {  
                            t=CT[i].endvex;  
                            w=GA[j][t];  
                            if(w<CT[i].weight)
                            {  
                                   CT[i].weight=w;  
                                   CT[i].fromvex=j;  
                            }  
                     }  
       }  
       return   CT;  
}
void   main()  
{  
       int   i;  
       adjmatrix   GA;  
       edge   *CT;// 指向边的指针  
       edge   *C;  
       edge   *GE;  
       int   e,n,ch;  
       cout<<"*****   WELCOME   *****"<<endl;  
       cout<<" 请输入顶点数n, 边数e:( 用空格隔开)"<<endl;  
       cin>>n>>e;  
       cout<<" 你打算采用那种算法?"<<endl;  
       cout<<"1.   Kruskal   算法"<<endl;  
       cout<<"2.   Prim   算法"<<endl;  
       cout<<" 请输入你的选择(1   or   2):";  
       cin>>ch;  
       switch(ch)  
       {  
       case   1:  
              GE=CreateES(n,e);  
              GE=SortGE(GE,e);  
              cout<<" 经过排序后:"<<endl;  
              cout<<"----------";   // 从这里开始绘制表格;   
              for(i=0;i<e;i++)  
                     cout<<"----";  
              cout<<endl;  
              cout<<"fromvex:   |";  
              for(i=0;i<e;i++)  
                     cout<<setw(3)<<GE[i].fromvex<<'|';  
              cout<<endl;  
              cout<<"endvex   :   |";  
              for(i=0;i<e;i++)  
                     cout<<setw(3)<<GE[i].endvex<<'|';  
              cout<<endl;  
              cout<<"weight   :   |";  
              for(i=0;i<e;i++)  
                     cout<<setw(3)<<GE[i].weight<<'|';  
              cout<<endl;  
              cout<<"----------";  // 到这里绘制表格结束 
              for(i=0;i<e;i++)  
                     cout<<"----";  
              cout<<endl;  
              C=Kruskal(GE,n,e);  
              cout<<"Kruskal 算法求得的最小生成树为:"<<endl;  
              for(i=0;i<n-1;i++)  
                     cout<<'<'<<C[i].fromvex<<','<<C[i].endvex<<'>'<<C[i].weight<<'   ';  
              cout<<endl<<" 处理结束"<<endl;  
              break;  
       case   2:  
              CreateAM(GA,n,e);    
              CT=Prim(GA,n);  
              cout<<"Prim 算法求得的最小生成树为:"<<endl;  
              for(i=0;i<n-1;i++)  
                     cout<<'<'<<CT[i].fromvex<<','<<CT[i].endvex<<'>'<<CT[i].weight<<'   ';  
              cout<<endl<<" 处理结束"<<endl;  
              break;  
       default:cout<<" 输入有误!"<<endl;  
}  
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值