最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

最小生成樹算法C語言代碼實例

 更新時間:2013年12月11日 16:47:43   作者:  
這篇文章主要介紹了最小生成樹算法C語言代碼實例,有需要的朋友可以參考一下

在貪婪算法這一章提到了最小生成樹的一些算法,首先是Kruskal算法,實現(xiàn)如下:

MST.h

復制代碼 代碼如下:

#ifndef H_MST
#define H_MST

#define NODE node *
#define G graph *
#define MST edge **

/* the undirect graph start */
typedef struct _node {
 char data;
 int flag;
 struct _node *parent;
} node;

typedef struct _edge {
 node *A;
 node *B;
 int w;
} edge;

typedef struct _graph {
 node **nodelist;
 int nodeLen;
 edge **edgelist;
 int edgeLen;
} graph;

/* the undirect graph end */

int kruskal(G , edge *[]);

int makeset(NODE);

int find(NODE , NODE);

int merge(NODE , NODE);

int comp(const void *, const void *);

#endif

MST.c

復制代碼 代碼如下:

#include "mst.h"
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
 /* Construct the undirect connected graph */
 graph g;
 g.nodeLen = 6;
 g.edgeLen = 10;

 node node_a, node_b, node_c, node_d, node_e, node_f;
 edge edge_1, edge_2, edge_3, edge_4, edge_5, edge_6, edge_7, edge_8, edge_9, edge_10;

 node_a.data = 'a';
 node_a.flag = 0;
 node_a.parent = (node *)malloc(sizeof(node));
 node_b.data = 'b';
 node_b.flag = 0;
 node_b.parent = (node *)malloc(sizeof(node));
 node_c.data = 'c';
 node_c.flag = 0;
 node_c.parent = (node *)malloc(sizeof(node));
 node_d.data = 'd';
 node_d.flag = 0;
 node_d.parent = (node *)malloc(sizeof(node));
 node_e.data = 'e';
 node_e.flag = 0;
 node_e.parent = (node *)malloc(sizeof(node));
 node_f.data = 'f';
 node_f.flag = 0;
 node_f.parent = (node *)malloc(sizeof(node));

 edge_1.A = &node_a;
 edge_1.B = &node_b;
 edge_1.w = 5;

 edge_2.A = &node_a;
 edge_2.B = &node_c;
 edge_2.w = 6;

 edge_3.A = &node_a;
 edge_3.B = &node_d;
 edge_3.w = 4;

 edge_4.A = &node_b;
 edge_4.B = &node_c;
 edge_4.w = 1;

 edge_5.A = &node_b;
 edge_5.B = &node_d;
 edge_5.w = 2;

 edge_6.A = &node_c;
 edge_6.B = &node_d;
 edge_6.w = 2;

 edge_7.A = &node_c;
 edge_7.B = &node_e;
 edge_7.w = 5;

 edge_8.A = &node_c;
 edge_8.B = &node_f;
 edge_8.w = 3;

 edge_9.A = &node_d;
 edge_9.B = &node_f;
 edge_9.w = 4;

 edge_10.A = &node_e;
 edge_10.B = &node_f;
 edge_10.w = 4;

 node **nodelist;
 nodelist = (node **)malloc(sizeof(node *) * g.nodeLen);
 edge **edgelist;
 edgelist = (edge **)malloc(sizeof(edge *) * g.edgeLen);

 nodelist[0] = &node_a;
 nodelist[1] = &node_b;
 nodelist[2] = &node_c;
 nodelist[3] = &node_d;
 nodelist[4] = &node_e;
 nodelist[5] = &node_f;

 edgelist[0] = &edge_1;
 edgelist[1] = &edge_2;
 edgelist[2] = &edge_3;
 edgelist[3] = &edge_4;
 edgelist[4] = &edge_5;
 edgelist[5] = &edge_6;
 edgelist[6] = &edge_7;
 edgelist[7] = &edge_8;
 edgelist[8] = &edge_9;
 edgelist[9] = &edge_10;

 g.nodelist = nodelist;
 g.edgelist = edgelist;

 edge *X[g.nodeLen-1];

 int e = 0;
 while (e < g.edgeLen)
 {
  printf("%c-%c %d\n", g.edgelist[e]->A->data, g.edgelist[e]->B->data, g.edgelist[e]->w);
  e++;
 }

 printf("------------------------------------------------------\n");

 kruskal(&g, X);

 e = 0;
 while (e < (g.nodeLen-1))
 {
  printf("%c-%c %d\n", X[e]->A->data, X[e]->B->data, X[e]->w);
  e++;
 }
}

int kruskal(G g, edge *pX[])
{
 int i, j;

 /* Initially every disjoint set have one node */
 for (i = 0; i < g->nodeLen; i++)
  makeset(g->nodelist[i]);

 /* sort the edgelist */
 qsort(g->edgelist, g->edgeLen, sizeof(edge *), comp);

 int e = 0;
 while (e < g->edgeLen)
 {
  printf("%c-%c %d\n", g->edgelist[e]->A->data, g->edgelist[e]->B->data, g->edgelist[e]->w);
  e++;
 }

 printf("------------------------------------------------------\n");

 node da, db;
 da.parent = (node *)malloc(sizeof(node));
 db.parent = (node *)malloc(sizeof(node));

 for (j = 0; j < g->edgeLen; j++)
 {
  find(g->edgelist[j]->A, &da);
  find(g->edgelist[j]->B, &db);

  if (da.data != db.data)
  {
   merge(g->edgelist[j]->A, g->edgelist[j]->B);
   *pX++ = g->edgelist[j];
  }
 }
}

int makeset(NODE n)
{
 n->parent = n;
}

int find(NODE n, NODE ds)
{
 if (n->parent == n)
 {
  ds->data = n->data;
  ds->flag = 1;
  ds->parent = n->parent;
 }

 if (n->parent != n)
  find(n->parent, ds);
}

int merge(NODE da, NODE db)
{
 if (da->flag)
  db->parent = da;
 else
  da->parent = db;
}

int comp(const void *ea, const void *eb)
{
 if ((*(edge **)ea)->w > (*(edge **)eb)->w) return 1;
 else if ((*(edge **)ea)->w == (*(edge **)eb)->w ) return 0;
 else return -1;
}

在實現(xiàn)這個算法的時候,真正體會到了測試的重要性。程序能成功編譯只是完成了一小部分,必須經過反復的測試才能發(fā)布。

相關文章

  • C/C++ 運用Npcap發(fā)送UDP數(shù)據(jù)包的完美過程

    C/C++ 運用Npcap發(fā)送UDP數(shù)據(jù)包的完美過程

    UDP 是一種無連接、輕量級的傳輸層協(xié)議,與 TCP 相比,它不提供可靠性、流控制和錯誤恢復機制,但卻更加簡單且具有較低的開銷,這篇文章主要介紹了C/C++ 運用Npcap發(fā)送UDP數(shù)據(jù)包,需要的朋友可以參考下
    2023-11-11
  • Qt中QMainWindow使用及技巧

    Qt中QMainWindow使用及技巧

    QMainWindow是Qt框架中提供的一個主窗口類,它具有菜單欄、工具欄、狀態(tài)欄等常見的GUI元素,本文就來介紹一下使用技巧,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • VC編程控件類HTControl之CHTGDIManager GDI資源管理類用法解析

    VC編程控件類HTControl之CHTGDIManager GDI資源管理類用法解析

    這篇文章主要介紹了VC編程控件類HTControl之CHTGDIManager GDI資源管理類用法解析,需要的朋友可以參考下
    2014-08-08
  • C語言程序環(huán)境中的預處理詳解

    C語言程序環(huán)境中的預處理詳解

    這篇文章主要為大家詳細介紹了C語言程序環(huán)境中的預處理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Qt sender()函數(shù)的具體使用

    Qt sender()函數(shù)的具體使用

    在處理信號時,Qt提供了一個特殊的函數(shù)sender(),可以返回發(fā)送信號的對象指針,以實現(xiàn)更靈活的代碼邏輯,本文就來介紹一下Qt sender()函數(shù)的具體使用,感興趣的可以了解一下
    2024-01-01
  • C++實現(xiàn)LeetCode(12.整數(shù)轉化成羅馬數(shù)字)

    C++實現(xiàn)LeetCode(12.整數(shù)轉化成羅馬數(shù)字)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(12.整數(shù)轉化成羅馬數(shù)字),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • C語言 文件的隨機讀寫詳解及示例代碼

    C語言 文件的隨機讀寫詳解及示例代碼

    本文主要介紹C語言 文件的隨機讀寫,這里整理了相關資料及示例代碼以便大家學習參考,學習此部分內容的朋友可以參考下
    2016-08-08
  • 基于C語言實現(xiàn)簡單掃雷游戲

    基于C語言實現(xiàn)簡單掃雷游戲

    這篇文章主要為大家詳細介紹了基于C語言實現(xiàn)簡單掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • STL list鏈表的用法詳細解析

    STL list鏈表的用法詳細解析

    這篇文章是關于C++語言的一個新的擴展——標準模板庫的(Standard Template Library),也叫STL
    2013-09-09
  • C語言函數(shù)指針詳解

    C語言函數(shù)指針詳解

    本文主要介紹 C語言函數(shù)指針的知識,這里整理了詳細的資料及示例代碼以便大家學習參考,有需要學習此部分知識的朋友可以參考下
    2021-09-09

最新評論

宿松县| 拜城县| 临高县| 惠东县| 沿河| 科技| 靖远县| 德清县| 惠安县| 连平县| 汝城县| 桦川县| 桐城市| 商洛市| 凤翔县| 汉源县| 定南县| 赣榆县| 藁城市| 区。| 乳山市| 武乡县| 剑阁县| 广平县| 九龙坡区| 封开县| 永年县| 当阳市| 宝鸡市| 河间市| 铜陵市| 乡城县| 和田县| 古交市| 逊克县| 肇源县| 夏津县| 句容市| 抚远县| 唐海县| 库尔勒市|