一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

圖的基本算法實現(xiàn)(鄰接矩陣與鄰接表兩種方法)

 goodwangLib 2013-12-22

本博客前面文章已對圖有過簡單的介紹,本文主要是重點介紹有關圖的一些具體操作與應用

閱讀本文前,可以先參考本博客 各種基本算法實現(xiàn)小結(四)—— 圖及其遍歷

 

一、無向圖

 

1 無向圖——鄰接矩陣

測試環(huán)境:VS2008

  1. #include "stdafx.h"  
  2. #include <stdlib.h>  
  3. #include <malloc.h>  
  4. #define MAX_VEX 20  
  5. #define INFINITY 65535  
  6. int *visited;  
  7. struct _node  
  8. {  
  9.     int vex_num;  
  10.     struct _node *next;  
  11. };  
  12. typedef struct _node node, *pnode;  
  13. struct _graph  
  14. {  
  15.     char *vexs;  
  16.     int arcs[MAX_VEX][MAX_VEX];  
  17.     int vexnum, arcnum;  
  18. };  
  19. typedef struct _graph graph, *pgraph;  
  20. int locate(graph g, char ch)  
  21. {  
  22.     int i;  
  23.     for(i=1; i<=g.vexnum; i++)  
  24.         if(g.vexs[i]==ch)  
  25.             return i;  
  26.     return -1;  
  27. }  
  28. graph create_graph()  
  29. {  
  30.     int i, j, w, p1, p2;  
  31.     char ch1, ch2;  
  32.     graph g;  
  33.     printf("Enter vexnum arcnum: ");  
  34.     scanf("%d %d", &g.vexnum, &g.arcnum);  
  35.     getchar();  
  36.     for(i=1; i<=g.vexnum; i++)  
  37.         for(j=1; j<g.vexnum; j++)  
  38.             g.arcs[i][j]=INFINITY;  
  39.     g.vexs=(char *)malloc(sizeof(char));  
  40.     printf("Enter %d vexnum.../n", g.vexnum);  
  41.     for(i=1; i<=g.vexnum; i++)  
  42.     {  
  43.         printf("vex %d: ", i);  
  44.         scanf("%c", &g.vexs[i]);  
  45.         getchar();  
  46.     }  
  47.     printf("Enter %d arcnum.../n", g.arcnum);  
  48.     for(i=1; i<=g.arcnum; i++)  
  49.     {  
  50.         printf("arc %d: ", i);  
  51.         scanf("%c %c %d", &ch1, &ch2, &w);  
  52.         getchar();  
  53.         p1=locate(g, ch1);  
  54.         p2=locate(g, ch2);  
  55.         g.arcs[p1][p2]=g.arcs[p2][p1]=w;  
  56.     }  
  57.     return g;  
  58. }  
  59. int firstvex_graph(graph g, int i)  
  60. {  
  61.     int k;  
  62.     if(i>=1 && i<=g.vexnum)  
  63.         for(k=1; k<=g.vexnum; k++)  
  64.             if(g.arcs[i][k]!=INFINITY)  
  65.                 return k;  
  66.     return -1;  
  67. }  
  68. int nextvex_graph(graph g, int i, int j)  
  69. {  
  70.     int k;  
  71.     if(i>=1 && i<=g.vexnum && j>=1 && j<=g.vexnum)  
  72.         for(k=j+1; k<=g.vexnum; k++)  
  73.             if(g.arcs[i][k]!=INFINITY)  
  74.                 return k;  
  75.     return -1;  
  76. }  
  77. void dfs(graph g, int i)  
  78. {  
  79.     int k, j;  
  80.     if(!visited[i])  
  81.     {  
  82.         visited[i]=1;  
  83.         printf("%3c", g.vexs[i]);  
  84.         for(j=firstvex_graph(g, i); j>=1; j=nextvex_graph(g, i, j))  
  85.             if(!visited[j])  
  86.                 dfs(g, j);  
  87.     }  
  88. }  
  89. void dfs_graph(graph g)  
  90. {  
  91.     int i;  
  92.     visited=(int *)malloc((g.vexnum+1)*sizeof(int));  
  93.     for(i=1; i<=g.vexnum; i++)  
  94.         visited[i]=0;  
  95.     for(i=1; i<g.vexnum; i++)  
  96.         if(!visited[i])  
  97.             dfs(g, i);  
  98. }  
  99. int _tmain(int argc, _TCHAR* argv[])  
  100. {  
  101.     graph g;  
  102.     g=create_graph();  
  103.     printf("DFS: ");  
  104.     dfs_graph(g);  
  105.     printf("/n");  
  106.     return 0;  
  107. }  

運行結果:

     

==========================================================

2 無向圖—— 鄰接表

測試環(huán)境:VS2008

  1. #include "stdafx.h"  
  2. #include <stdlib.h>  
  3. #include <malloc.h>  
  4. #define MAX_VEX 20  
  5. int *visited;  
  6. typedef struct _ArcNode  
  7. {  
  8.     int ivex; /* next ivex */  
  9.     struct _ArcNode *nextarc; /* next node */  
  10.     int *info; /* arc weight */  
  11. };  
  12. typedef struct _ArcNode ArcNode, *pArcNode;  
  13. struct _VNode  
  14. {  
  15.     char adjvex; /* note vex */  
  16.     ArcNode *firstarc;  
  17. };  
  18. typedef struct _VNode VNode;  
  19. struct _ALGraph  
  20. {  
  21.     VNode AdjList[MAX_VEX];  
  22.     int vexnum, arcnum;  
  23.     int kink;  
  24. };  
  25. typedef struct _ALGraph ALGraph;  
  26. int locate(ALGraph g, char ch)  
  27. {  
  28.     int i;  
  29.     for(i=1; i<=g.vexnum; i++)  
  30.         if(g.AdjList[i].adjvex==ch)  
  31.             return i;  
  32.     return -1;  
  33. }  
  34. ALGraph create_graph()  
  35. {  
  36.     int i, j, w, p1, p2;  
  37.     char ch1, ch2;  
  38.     pArcNode pnode, pnode1, pnode2;  
  39.     ALGraph g;  
  40.     printf("Enter vexnum arcnum: ");  
  41.     scanf("%d %d", &g.vexnum, &g.arcnum);  
  42.     getchar();  
  43.       
  44.     printf("Enter %d vexnum.../n", g.vexnum);  
  45.     for(i=1; i<=g.vexnum; i++)  
  46.     {  
  47.         printf("vex %d: ", i);  
  48.         scanf("%c", &g.AdjList[i].adjvex);  
  49.         getchar();  
  50.         g.AdjList[i].firstarc=NULL;  
  51.     }  
  52.     printf("Enter arc.../n");  
  53.     for(i=1; i<=g.arcnum; i++)  
  54.     {  
  55.         printf("arc %d: ", i);  
  56.         scanf("%c %c", &ch1, &ch2);  
  57.         getchar();  
  58.         p1=locate(g, ch1);  
  59.         p2=locate(g, ch2);  
  60.         pnode1=(pArcNode)malloc(sizeof(ArcNode));  
  61.         pnode2=(pArcNode)malloc(sizeof(ArcNode));  
  62.         pnode1->ivex=p2; /* next ivex */  
  63.         pnode1->nextarc=g.AdjList[p1].firstarc;  
  64.         g.AdjList[p1].firstarc=pnode1;  
  65.         pnode2->ivex=p1; /* next ivex */  
  66.         pnode2->nextarc=g.AdjList[p2].firstarc;  
  67.         g.AdjList[p2].firstarc=pnode2;  
  68.     }  
  69.     return g;  
  70. }  
  71. int firstvex_graph(ALGraph g, int i)  
  72. {  
  73.     int k;  
  74.     if(i>=1 && i<=g.vexnum)     
  75.         if(g.AdjList[i].firstarc)  
  76.             return g.AdjList[i].firstarc->ivex;  
  77.     return -1;  
  78. }  
  79. int nextvex_graph(ALGraph g, int i, int k)  
  80. {  
  81.     pArcNode pnode;  
  82.     if(i>=1 && i<=g.vexnum && k>=1 && k<=g.vexnum)  
  83.     {  
  84.         pnode=g.AdjList[i].firstarc;  
  85.         while(pnode->nextarc)  
  86.         {  
  87.             k=pnode->nextarc->ivex;  
  88.             if(!visited[k])  
  89.                 return k;  
  90.             else  
  91.                 pnode=pnode->nextarc;  
  92.         }  
  93.     }  
  94.     return -1;  
  95. }  
  96. void dfs(ALGraph g, int i)  
  97. {  
  98.     int k;  
  99.     if(!visited[i])  
  100.     {  
  101.         visited[i]=1;  
  102.         printf("%c", g.AdjList[i].adjvex);  
  103.         for(k=firstvex_graph(g, i); k>=1; k=nextvex_graph(g, i, k))  
  104.             if(!visited[k])  
  105.                 dfs(g, k);  
  106.     }  
  107. }  
  108. void dfs_graph(ALGraph g)  
  109. {  
  110.     int i;  
  111.     visited=(int *)malloc((g.vexnum+1)*sizeof(int));  
  112.     for(i=1; i<=g.vexnum; i++)  
  113.         visited[i]=0;  
  114.     for(i=1; i<=g.vexnum; i++)  
  115.         if(!visited[i])  
  116.             dfs(g, i);  
  117. }  
  118. int _tmain(int argc, _TCHAR* argv[])  
  119. {  
  120.     ALGraph g;  
  121.     g=create_graph();  
  122.     dfs_graph(g);  
  123.     printf("/n");  
  124.     return 0;  
  125. }  

運行結果:

    

==========================================================

 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产成人人人97超碰熟女| 日韩一区二区三区在线日| 欧美日韩精品一区二区三区不卡| 99久久精品午夜一区| 国产又黄又猛又粗又爽的片| 午夜精品麻豆视频91| 国产亚洲不卡一区二区| 国产日韩欧美在线亚洲| 国产亚洲精品久久99| 国产又猛又大又长又粗| 欧美精品日韩精品一区| 日韩欧美91在线视频| 国产麻豆视频一二三区| 自拍偷拍一区二区三区| 东京热加勒比一区二区三区| 国产伦精品一区二区三区高清版| 日韩中文字幕免费在线视频| 国产日韩欧美国产欧美日韩| 欧美亚洲另类久久久精品| 亚洲国产av国产av| 日韩欧美国产精品中文字幕| 欧美一二三区高清不卡| 免费观看潮喷到高潮大叫| 超碰在线播放国产精品| 成人精品视频一区二区在线观看| 国产视频在线一区二区| 日韩成人h视频在线观看| 亚洲性日韩精品一区二区| 精品欧美国产一二三区| 日韩特级黄片免费观看| 一本色道久久综合狠狠躁| 久七久精品视频黄色的| 最新日韩精品一推荐日韩精品| 免费观看在线午夜视频| 国产偷拍盗摄一区二区| 五月天六月激情联盟网| 日本精品中文字幕人妻| 日韩一级免费中文字幕视频| 中文字幕高清不卡一区| 五月婷婷欧美中文字幕| 亚洲国产av一二三区|