实验七 图的最小生成树算法

按照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\n");
    for(i=0;i<n;i++)//建立点的集合
    {  
    scanf("%d",&t[i].data);
    t[i].jihe=i;
    }
    printf("请输入边的条数:");
    scanf("%d",&m);
    printf("请输入vexh,vext,weight:\n");
    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\n",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("最小生成树为:\n");
   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\n",(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("请输入图中顶点的个数:\n"); 
    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
*/

 

posted @ 2018-01-02 10:21  Hztiger  阅读(370)  评论(0编辑  收藏  举报