• prim算法和克鲁斯卡尔算法


    Prim

    设图G=(V,E)是一个具有n个顶点的连通网,其生成树的顶点集合为U。首先把v0放入U,再在所有的u∈U,v∈V-U的边(u,v)∈E中找一条最小权值的边,加入生成树,并把该边的v加入U集合。如果U集合已经有n个元素,则结束,否则在剩下的部分中继续寻找最小权值的边。

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3  
     4 #define infinity 9999
     5 #define MAX 20
     6  
     7 int G[MAX][MAX],spanning[MAX][MAX],n;
     8  
     9 int prims();
    10  
    11 int main()
    12 {
    13     int i,j,total_cost;
    14     printf("Enter no. of vertices:");
    15     scanf("%d",&n);
    16     
    17     printf("
    Enter the adjacency matrix:
    ");
    18     
    19     for(i=0;i<n;i++)
    20         for(j=0;j<n;j++)
    21             scanf("%d",&G[i][j]);
    22     
    23     total_cost=prims();
    24     printf("
    spanning tree matrix:
    ");
    25     
    26     for(i=0;i<n;i++)
    27     {
    28         printf("
    ");
    29         for(j=0;j<n;j++)
    30             printf("%d	",spanning[i][j]);
    31     }
    32     
    33     printf("
    
    Total cost of spanning tree=%d",total_cost);
    34     return 0;
    35 }
    36  
    37 int prims()
    38 {
    39     int cost[MAX][MAX];
    40     int u,v,min_distance,distance[MAX],from[MAX];
    41     int visited[MAX],no_of_edges,i,min_cost,j;
    42     
    43     //create cost[][] matrix,spanning[][]
    44     for(i=0;i<n;i++)
    45         for(j=0;j<n;j++)
    46         {
    47             if(G[i][j]==0)
    48                 cost[i][j]=infinity;
    49             else
    50                 cost[i][j]=G[i][j];
    51                 spanning[i][j]=0;
    52         }
    53         
    54     //initialise visited[],distance[] and from[]
    55     distance[0]=0;
    56     visited[0]=1;
    57     
    58     for(i=1;i<n;i++)
    59     {
    60         distance[i]=cost[0][i];
    61         from[i]=0;
    62         visited[i]=0;
    63     }
    64     
    65     min_cost=0;        //cost of spanning tree
    66     no_of_edges=n-1;        //no. of edges to be added
    67     
    68     while(no_of_edges>0)
    69     {
    70         //find the vertex at minimum distance from the tree
    71         min_distance=infinity;
    72         for(i=1;i<n;i++)
    73             if(visited[i]==0&&distance[i]<min_distance)
    74             {
    75                 v=i;
    76                 min_distance=distance[i];
    77             }
    78             
    79         u=from[v];
    80         
    81         //insert the edge in spanning tree
    82         spanning[u][v]=distance[v];
    83         spanning[v][u]=distance[v];
    84         no_of_edges--;
    85         visited[v]=1;
    86         
    87         //updated the distance[] array
    88         for(i=1;i<n;i++)
    89             if(visited[i]==0&&cost[i][v]<distance[i])
    90             {
    91                 distance[i]=cost[i][v];
    92                 from[i]=v;
    93             }
    94         
    95         min_cost=min_cost+cost[u][v];
    96     }
    97     
    98     return(min_cost);
    99 }

    COST = 16 + 5 + 6 + 11 + 18 = 56

    Kruskal

      1 #include<stdio.h>
      2  
      3 #define MAX 30
      4  
      5 typedef struct edge
      6 {
      7     int u,v,w;
      8 }edge;
      9  
     10 typedef struct edgelist
     11 {
     12     edge data[MAX];
     13     int n;
     14 }edgelist;
     15  
     16 edgelist elist;
     17  
     18 int G[MAX][MAX],n;
     19 edgelist spanlist;
     20  
     21 void kruskal();
     22 int find(int belongs[],int vertexno);
     23 void union1(int belongs[],int c1,int c2);
     24 void sort();
     25 void print();
     26  
     27 void main()
     28 {
     29     int i,j,total_cost;
     30     
     31     printf("
    Enter number of vertices:");
     32     
     33     scanf("%d",&n);
     34     
     35     printf("
    Enter the adjacency matrix:
    ");
     36     
     37     for(i=0;i<n;i++)
     38         for(j=0;j<n;j++)
     39             scanf("%d",&G[i][j]);
     40             
     41     kruskal();
     42     print();
     43 }
     44  
     45 void kruskal()
     46 {
     47     int belongs[MAX],i,j,cno1,cno2;
     48     elist.n=0;
     49  
     50     for(i=1;i<n;i++)
     51         for(j=0;j<i;j++)
     52         {
     53             if(G[i][j]!=0)
     54             {
     55                 elist.data[elist.n].u=i;
     56                 elist.data[elist.n].v=j;
     57                 elist.data[elist.n].w=G[i][j];
     58                 elist.n++;
     59             }
     60         }
     61  
     62     sort();
     63     
     64     for(i=0;i<n;i++)
     65         belongs[i]=i;
     66     
     67     spanlist.n=0;
     68     
     69     for(i=0;i<elist.n;i++)
     70     {
     71         cno1=find(belongs,elist.data[i].u);
     72         cno2=find(belongs,elist.data[i].v);
     73         
     74         if(cno1!=cno2)
     75         {
     76             spanlist.data[spanlist.n]=elist.data[i];
     77             spanlist.n=spanlist.n+1;
     78             union1(belongs,cno1,cno2);
     79         }
     80     }
     81 }
     82  
     83 int find(int belongs[],int vertexno)
     84 {
     85     return(belongs[vertexno]);
     86 }
     87  
     88 void union1(int belongs[],int c1,int c2)
     89 {
     90     int i;
     91     
     92     for(i=0;i<n;i++)
     93         if(belongs[i]==c2)
     94             belongs[i]=c1;
     95 }
     96  
     97 void sort()
     98 {
     99     int i,j;
    100     edge temp;
    101     
    102     for(i=1;i<elist.n;i++)
    103         for(j=0;j<elist.n-1;j++)
    104             if(elist.data[j].w>elist.data[j+1].w)
    105             {
    106                 temp=elist.data[j];
    107                 elist.data[j]=elist.data[j+1];
    108                 elist.data[j+1]=temp;
    109             }
    110 }
    111  
    112 void print()
    113 {
    114     int i,cost=0;
    115     
    116     for(i=0;i<spanlist.n;i++)
    117     {
    118         printf("
    %d	%d	%d",spanlist.data[i].u,spanlist.data[i].v,spanlist.data[i].w);
    119         cost=cost+spanlist.data[i].w;
    120     }
    121  
    122     printf("
    
    Cost of the spanning tree=%d",cost);
    123 }

  • 相关阅读:
    英语八大时态
    linux yum被占用
    文件上传ajaxfileupload.js插件
    jquery.qrcode.js生成二维码
    判断手机,pc方式登录
    点击小图轮播,点击显示大图
    图片预览功能
    Java Hash表 数据结构
    Java Tree 树 数据结构
    Java Queue 队列
  • 原文地址:https://www.cnblogs.com/junsircoding/p/prim.html
Copyright © 2020-2023  润新知