邻结矩阵的建立和 BFS,DFS;;
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                邻结矩阵的建立和 BFS,DFS;;
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                
                            
                            
                            鄰結矩陣比較簡單,, 它的BFS,DFS, 兩種遍歷也比較簡單,一個用隊列, 一個用數組即可!!!
但是鄰接矩陣極其浪費空間,尤其是當它是一個稀疏矩陣的時候!!!
---------------------------------------------------------------------------------------------------------------------------------------
//鄰接矩陣的建立和 其BFS, DFS, 遍歷 #include <cstdio> #include <cstdlib> //#define _OJ_int visit[100]; int cnt = 0; typedef struct Graph1 {int nv;int ne;int a[100][100]; } Graph1, *Graph; //建立一個圖含頂點, 邊, 和鄰接矩陣Graph creat_graph(void) {Graph g;int i, j;int v1, v2;g = (Graph) malloc (sizeof(Graph1));scanf("%d %d", &g->nv, &g->ne);for(i = 0;i < g->nv; i++) {for(j = 0;j < g->nv; j++) {g->a[i][j] = 0;}} //對鄰結矩陣賦初始值for(i = 0;i < g->ne; i++) {scanf("%d %d", &v1, &v2);g->a[v1][v2] = 1;g->a[v2][v1] = 1;} //建立一個無向矩陣return g; }void DFS(Graph g, int i) {int j;// lif(cnt == g->nv - 1)// printf("%d\n", i);// else { //此地有一個小技巧就是判斷什么時候結束?// printf("%d ", i); //用一個全局變量cnt 由于每一個點遍歷一次// cnt++; cnt == g->nv - 1 時結束;用此處理最后一個不要空格和換行// }printf("%d ", i);visit[i] = 1;for(j = 0;j < g->nv; j++) {if(g->a[i][j] == 1 && visit[j] == 0)DFS(g, j);} }void DFS_travers(Graph g) {int i;for(i = 0;i < g->nv; i++)visit[i] = 0;for(i = 0;i < g->nv; i++) {if(visit[i] == 0)DFS(g, i);} }typedef struct Queue1 {int top;int base;int *elem; } Queue1, *Queue;Queue creat_Queue(void) {Queue q;q = (Queue) malloc (sizeof(Queue1));q->elem = (int*) malloc (100 * sizeof(int));q->base = q->top = 0;return q; }int isempty(Queue q) {if(q->base == q->top)return 1;elsereturn 0; }void Enqueue(Queue q, int data) {q->elem[q->top++] = data; }int Dequeue(Queue q) {return q->elem[q->base++]; }void BFS(Graph g, int v) {int i, j;Queue q;q = creat_Queue();printf("%d ", v);visit[v] = 1;Enqueue(q, v);while (isempty(q) != 1) {i = Dequeue(q);for(j = 0;j < g->nv; j++) {if(g->a[i][j] && visit[j] == 0 ) {printf("%d ", j); //把整排先全都遍歷完,在遍歷其它的visit[j] = 1; //每次先遍歷在入隊Enqueue(q, j);}}}}void BFS_travers(Graph g) {int i;for(i = 0;i < g->nv; i++)visit[i] = 0;for(i = 0;i < g->nv; i++) {if(visit[i] == 0)BFS(g, i);} }int main(int argc, char const *argv[]) { #ifndef _OJ_ //ONLINE_JUDGEfreopen("input.txt", "r", stdin); #endifGraph g;g = creat_graph();DFS_travers(g);printf("\n");BFS_travers(g);return 0; }
                        
                        
                        但是鄰接矩陣極其浪費空間,尤其是當它是一個稀疏矩陣的時候!!!
---------------------------------------------------------------------------------------------------------------------------------------
//鄰接矩陣的建立和 其BFS, DFS, 遍歷 #include <cstdio> #include <cstdlib> //#define _OJ_int visit[100]; int cnt = 0; typedef struct Graph1 {int nv;int ne;int a[100][100]; } Graph1, *Graph; //建立一個圖含頂點, 邊, 和鄰接矩陣Graph creat_graph(void) {Graph g;int i, j;int v1, v2;g = (Graph) malloc (sizeof(Graph1));scanf("%d %d", &g->nv, &g->ne);for(i = 0;i < g->nv; i++) {for(j = 0;j < g->nv; j++) {g->a[i][j] = 0;}} //對鄰結矩陣賦初始值for(i = 0;i < g->ne; i++) {scanf("%d %d", &v1, &v2);g->a[v1][v2] = 1;g->a[v2][v1] = 1;} //建立一個無向矩陣return g; }void DFS(Graph g, int i) {int j;// lif(cnt == g->nv - 1)// printf("%d\n", i);// else { //此地有一個小技巧就是判斷什么時候結束?// printf("%d ", i); //用一個全局變量cnt 由于每一個點遍歷一次// cnt++; cnt == g->nv - 1 時結束;用此處理最后一個不要空格和換行// }printf("%d ", i);visit[i] = 1;for(j = 0;j < g->nv; j++) {if(g->a[i][j] == 1 && visit[j] == 0)DFS(g, j);} }void DFS_travers(Graph g) {int i;for(i = 0;i < g->nv; i++)visit[i] = 0;for(i = 0;i < g->nv; i++) {if(visit[i] == 0)DFS(g, i);} }typedef struct Queue1 {int top;int base;int *elem; } Queue1, *Queue;Queue creat_Queue(void) {Queue q;q = (Queue) malloc (sizeof(Queue1));q->elem = (int*) malloc (100 * sizeof(int));q->base = q->top = 0;return q; }int isempty(Queue q) {if(q->base == q->top)return 1;elsereturn 0; }void Enqueue(Queue q, int data) {q->elem[q->top++] = data; }int Dequeue(Queue q) {return q->elem[q->base++]; }void BFS(Graph g, int v) {int i, j;Queue q;q = creat_Queue();printf("%d ", v);visit[v] = 1;Enqueue(q, v);while (isempty(q) != 1) {i = Dequeue(q);for(j = 0;j < g->nv; j++) {if(g->a[i][j] && visit[j] == 0 ) {printf("%d ", j); //把整排先全都遍歷完,在遍歷其它的visit[j] = 1; //每次先遍歷在入隊Enqueue(q, j);}}}}void BFS_travers(Graph g) {int i;for(i = 0;i < g->nv; i++)visit[i] = 0;for(i = 0;i < g->nv; i++) {if(visit[i] == 0)BFS(g, i);} }int main(int argc, char const *argv[]) { #ifndef _OJ_ //ONLINE_JUDGEfreopen("input.txt", "r", stdin); #endifGraph g;g = creat_graph();DFS_travers(g);printf("\n");BFS_travers(g);return 0; }
?
轉載于:https://www.cnblogs.com/airfand/p/5020420.html
總結
以上是生活随笔為你收集整理的邻结矩阵的建立和 BFS,DFS;;的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: SQL里的SWITCH分支语句
- 下一篇: 排序算法[转]
