数据结构——图的遍历和存储
来源:互联网 发布:普鲁申科 亚古丁 知乎 编辑:程序博客网 时间:2024/06/05 13:25
可能本人比较懒,图的邻接表用到了C++STL里面的vector,不过思路是一样的
代码:
#include<bits/stdc++.h>#define N 1009using namespace std;typedef pair<int, int> P;vector<int> mp[N], mp1[N];int n, m, mm, nn;void menu(){ printf("\t\t1.建图\n"); printf("\t\t2.输出邻接表\n"); printf("\t\t3.各顶点的度\n"); printf("\t\t4.dfs\n"); printf("\t\t5.bfs\n"); printf("\t\t6.退出\n");}void init(){ printf("建立无向图\n"); printf("请输入m, n和m个顶点n条边\n"); int u, v; scanf("%d%d", &m, &n); for(int i = 1; i <= m; i++) mp[i].clear(); for(int i = 1; i <= n; i++) { scanf("%d%d", &u, &v); mp[u].push_back(v); mp[v].push_back(u); } printf("建立有向图\n"); printf("请输入m, n和m个顶点n条边\n"); scanf("%d%d", &mm, &nn); for(int i = 1; i <= mm; i++) mp1[i].clear(); for(int i = 1; i <= nn; i++) { scanf("%d%d", &u, &v); mp1[u].push_back(v); } printf("创建成功!\n");}void display(){ for(int i = 1; i <= m; i++) { int k = mp[i].size(); printf("%d能到达的: ", i); for(int j = 0; j < k; j++) cout << mp[i][j] << " "; cout << endl; } cout << endl; for(int i = 1; i <= mm; i++) { int k = mp1[i].size(); printf("%d能到达的: ", i); for(int j = 0; j < k; j++) cout << mp1[i][j] << " "; cout << endl; } cout << endl;}void display_D(){ printf("无向图:\n"); for(int i = 1; i <= m; i++) { int k = mp[i].size(); printf("顶点%d: %d\n", i, k); } printf("有向图:\n"); int d[N]; memset(d, 0, sizeof(d)); for(int i = 1; i <= mm; i++) { int k = mp1[i].size(); for(int j = 0; j < k; j++) d[mp1[i][j]]++; } for(int i = 1; i <= mm; i++) { int k = mp1[i].size(); printf("顶点%d: 出度 %d 入度 %d\n", i, k, d[i]); }}//非递归void dfs(){ int vis[N], i, j; char ans[N]; int cnt = 0; ans[cnt++] = 1 + '0'; memset(vis, 0, sizeof(vis)); vis[1] = 1; stack<P> s; P ss; ss.first = 1; ss.second = 0; s.push(ss); while(!s.empty()) { P u = s.top(); int k = mp[u.first].size(); for(j = u.second; j < k; j++) { int v = mp[u.first][j]; s.top().second++; if(s.top().second == k) s.pop(); if(vis[v]) continue; vis[v] = 1; ss.first = v; ss.second = 0; s.push(ss); ans[cnt++] = v + '0'; break; } } for(i = 1; i <= m; i++) if(!vis[i]) ans[cnt++] = i + '0'; for(i = 0; i < cnt; i++) printf("%c ", ans[i]); cout << endl;}void bfs(){ int vis[N], i, j; char ans[N]; int cnt = 0; memset(vis, 0, sizeof(vis)); queue<int> q; q.push(1); vis[1] = 1; ans[cnt++] = 1 + '0'; while(!q.empty()) { int u = q.front(); q.pop(); int k = mp[u].size(); for(j = 0; j < k; j++) { int v = mp[u][j]; if(vis[v]) continue; vis[v] = 1; q.push(v); ans[cnt++] = v + '0'; } } for(i = 1; i <= m; i++) if(!vis[i]) ans[cnt++] = i + '0'; ans[cnt] = '\0'; for(i = 0; i < cnt; i++) printf("%c ", ans[i]); cout << endl;}/*样例:6 61 21 31 62 42 52 64 51 24 24 31 33 1*/int main(){ while(true) { int sel; menu(); scanf("%d", &sel); switch(sel) { case 1: init(); break; case 2: display(); break; case 3: display_D(); break; case 4: dfs(); break; case 5: bfs(); break; } if(sel == 6) break; } return 0;}
阅读全文
0 0
- 数据结构——图的遍历和存储
- 【数据结构】图的存储和遍历
- 数据结构之图:图的存储结构和遍历
- 数据结构之 图的存储结构和遍历方式
- 数据结构--图--图的数组存储表示,深度优先搜索遍历和广度优先搜索遍历
- 数据结构 — 图之邻接表存储创建和深度优先遍历
- 数据结构——图(概念,存储,遍历)
- 数据结构—连通图的遍历—DFS和BFS
- 图的存储和遍历
- 图的存储和遍历
- 图的存储和遍历
- 数据结构:二叉树的遍历和存储结构
- 数据结构-二叉树的存储结构和遍历算法(四)
- 常用数据结构-二叉树的链式存储、建立和遍历
- 数据结构——线性表的伪链表存储(顺序存储链式遍历)
- 数据结构与算法专题之图——图的遍历(深度优先遍历和广度优先遍历)
- 数据结构—图的存储—邻接表和邻接矩阵
- 重温数据结构——图的遍历
- 腾讯云入门使用(一) CentOS购买、登录及域名绑定IP
- hessian入门,spring集成
- 指针数组和数组指针
- c++ type trait 之 类型判断工具
- 企业人事管理系统
- 数据结构——图的遍历和存储
- Jquery用法
- C++中的RTTI(runtime type information) 机制
- Matlab自适应滤波器设计Demo——LMS,RLS
- 04-树4 是否同一棵二叉搜索树 (25分)
- windows 下 Redis 主从 读写分离
- Entity Framework- Databinding with WinForms
- 应付考试用的KMP算法中next数组及nextval数组的计算(笑)
- 北大 AI 公开课第8讲:华为李航——NLP 有 5 个基本问题,深度学习有4个做得很好 (PPT)