zoukankan      html  css  js  c++  java
  • 实验七 图的最小生成树算法

    按照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
    */
  • 相关阅读:
    TreeView 控件选中项变色
    遍历repeater
    堆和栈,类型声明实例化过程,string=null;string=”“的区别;
    用Oled操作EXCEL碰到错误
    修改部分代码,让优酷和ckplayer可覆盖,优酷播放的部分API。
    C# 拼接字符串,自实现翻页功能
    总结Vue第二天:自定义子组件、父子组件通信、插槽
    总结Vue第一天:简单介绍、基本常用知识、辅助函数
    总结Vue第三天:模块化和webpack模块化打包:
    PHP之冒泡排序
  • 原文地址:https://www.cnblogs.com/accept/p/8175954.html
Copyright © 2011-2022 走看看