zoukankan      html  css  js  c++  java
  • 邻结矩阵的建立和 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 ", 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; else return 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_JUDGE freopen("input.txt", "r", stdin); #endif Graph g; g = creat_graph(); DFS_travers(g); printf(" "); BFS_travers(g); return 0; }
  • 相关阅读:
    图形控件开发商十年之旅回顾
    图表控件,数据可视化,你真的选对了吗?
    话说LightningChart是最快最美的图表控件,到底先进在哪里?
    LayUI技巧总结
    解决EFCore缓存机制导致的数据查询错误问题
    关于反射的那些骚操作
    .NetCore借助AutoMapper实现全局数据字段按角色过滤
    记录一次EFCore CodeFirst迁移实践,解决多个项目表结构同步更新问题
    SQL查询整个数据库中某个特定值所在的表和字段的方法
    Visual Studio利用正则表达式进行查找和替换
  • 原文地址:https://www.cnblogs.com/airfand/p/5020420.html
Copyright © 2011-2022 走看看