图邻接矩阵的c语言实现 graph_adj_matrix.cpp
2017-07-11 07:43
495 查看
gra_adj_matrix.cpp 文件
good luck !
#include <iostream> #include <stdlib.h> #include <limits.h> using namespace std; #define Vertex_MAX 15 #define Edge_MAX 15*(15-1) typedef int elemtype; //typedef float elemtype; int Vertex_n = 0; int Edge_n = 0; struct graph { elemtype V[Vertex_MAX+1]; //顶点 elemtype arcs[Vertex_MAX+1][Vertex_MAX+1]; //边(i,j) }; //访问标志位 char visited[Vertex_MAX+1] = {0}; //建立无向图邻接矩阵 void UDcreatadj_matrix(graph& g) { int i,j,k; //输入顶点个数和边的个数 printf("请输入顶点个数:"); cin>>Vertex_n; printf("请输入边的个数:"); cin>>Edge_n; //输入顶点信息 for (k = 1; k <= Vertex_n; k++) { printf("请输入%d个顶点,第%d个顶点: ",Vertex_n,k); cin>>g.V[k]; } //矩阵初始化 for (i = 1; i <= Vertex_n; i ++) { for (j = 1; j <= Vertex_n; j++ ) { g.arcs[i][j] = 0; } } //输入边(i,j) for (k = 1; k <= Edge_n; k++) { printf("请输入%d个边,第%d个边(i j): ",Edge_n,k); cin>>i>>j; g.arcs[i][j] = 1; g.arcs[j][i] = 1; } //输出矩阵 for (i = 1; i <= Vertex_n; i ++) { for (j = 1; j <= Vertex_n; j++ ) { printf("%d ",g.arcs[i][j]); } printf("\n"); } } //邻接矩阵存储,深度优先搜索算法,无向图连通图,遍历顶点 void UDdfs_adj_matrix(graph& g , int onevertex,int vertex_n) { int j; cout<<g.V[onevertex]<<endl; //第一个要访问的顶点 visited[onevertex] = 1; //标志置1 for (j = 1; j<= vertex_n; j++) { if (g.arcs[onevertex][j] == 1 && !visited[j]) //存在边关系的顶点 { //cout<<onevertex<<" "<<j<<endl; //有问题 UDdfs_adj_matrix(g,j,vertex_n); } } } //连通图和非连通图,深度搜索算法 void UDdfs_all_adj_matrix(graph& g , int vertex_n) { for (int kk = 1; kk <= vertex_n; kk ++ ) { if (!visited[kk]) { UDdfs_adj_matrix(g , kk , vertex_n);//所有顶点都作为起点遍历 } } } //邻接矩阵存储,广度优先搜索算法,无向图连通图,遍历顶点 void UDbfs_adj_matrix(graph& g , int onevertex,int vertex_n) { //int Q[Vertex_MAX + 1]; int *Q = new int[vertex_n + 1]; //Q为队列 memset(Q,0,sizeof(int)*(vertex_n + 1)); int f , r, j; //f,r分别为队列头,尾指针 f = r = 0; cout<<g.V[onevertex]<<endl; //输出访问顶点 visited[onevertex] = 1; //标志已经访问过 r++; Q[r] = onevertex; //入队列 while(f < r) { f++; onevertex = Q[f]; //出队列 for (j=1; j<=vertex_n; j++) { if ((g.arcs[onevertex][j] == 1) && (!visited[j])) { cout<<g.V[j]<<endl; visited[j] = 1; r++; Q[r] = j; } } } if (Q != NULL) { delete [] Q; Q = NULL; } } //连通图和非连通图,广度搜索算法 void UDbfs_all_adj_matrix(graph& g , int vertex_n) { for (int kk = 1; kk <= vertex_n; kk ++ ) { if (!visited[kk]) { UDbfs_adj_matrix(g ,kk,vertex_n); } } } //建立有向图邻接矩阵 void Dcreateadj_matrix(graph& g) { int i , j, k; //输入顶点个数和边的个数 printf("请输入顶点个数:"); cin>>Vertex_n; printf("请输入边的个数:"); cin>>Edge_n; //输入顶点信息 for (i = 1; i <= Vertex_n; i ++) { printf("请输入%d个顶点,第%d个顶点: ",Vertex_n,i); cin>>g.V[i]; } //矩阵初始化 for (i = 1; i <= Vertex_n; i ++) { for (j = 1; j <= Vertex_n; j++) { g.arcs[i][j] = 0; } } //输入弧 for (k = 1; k <= Edge_n; k++) { printf("请输入%d个边,第%d个弧(i j): ",Edge_n,k); cin>>i>>j; g.arcs[i][j] = 1; } //输出矩阵 for (i = 1; i <= Vertex_n; i ++) { for (j = 1; j <= Vertex_n; j++ ) { printf("%d ", g.arcs[i][j]); } printf("\n"); } } //建立无向网的邻接矩阵 void UDNetcreatadj_matrix(graph& g) { int i,j,k; //权值 int w; //输入顶点个数和边的个数 printf("请输入顶点个数:"); cin>>Vertex_n; printf("请输入边的个数:"); cin>>Edge_n; //输入顶点信息 for (k = 1; k <= Vertex_n; k++) { printf("请输入%d个顶点,第%d个顶点: ",Vertex_n,k); cin>>g.V[k]; } //矩阵初始化 for (i = 1; i <= Vertex_n; i ++) { for (j = 1; j <= Vertex_n; j++ ) { if (i == j) { g.arcs[i][j] = 0; } else g.arcs[i][j] = 65536; //此处应该是无穷大 } } //输入边(i,j)及权值 for (k = 1; k <= Edge_n; k++) { printf("请输入%d个边,第%d个边和权值(i j w): ",Edge_n,k); cin>>i>>j>>w; g.arcs[i][j] = w; g.arcs[j][i] = w; } //输出矩阵 for (i = 1; i <= Vertex_n; i ++) { for (j = 1; j <= Vertex_n; j++ ) { printf("%d ",g.arcs[i][j]); } printf("\n"); } } int main() { graph g; UDcreatadj_matrix(g); //Dcreateadj_matrix(g); //UDNetcreatadj_matrix(g); UDdfs_adj_matrix(g, 1,Vertex_n); //UDbfs_adj_matrix(g,1,Vertex_n); system("pause"); return 0; }
good luck !
相关文章推荐
- 图邻接链表c语言实现 graph_adj_link.cpp
- 基于邻接矩阵的Prim算法(C语言实现)
- 图邻接矩阵存储 最小生成树 prim普里姆算法 C语言实现
- 数据结构之---C语言实现图的数组(邻接矩阵)存储表示
- LeetCode-59-Spiral Matrix II(C语言实现)
- LeetCode-54-Spiral Matrix(C语言实现)
- C语言链表的实现(修改版)Cpp文件
- c语言实现图的基本操作--邻接矩阵存储
- git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0
- 图的深度优先遍历DFS (邻接矩阵实现) c语言
- Adjacency Matrix of Graph(图的邻接矩阵)
- 图的邻接矩阵的建立(C语言实现)
- Recursive Depth first search graph(adj matrix)
- [数据结构]C语言实现,邻接矩阵实现图的广度优先遍历
- 图的邻接矩阵存储 深度优先遍历 广度优先遍历 C语言实现
- C语言实现邻接矩阵
- Prim算法的C语言实现(邻接矩阵)
- [数据结构]图邻接矩阵C语言简单实现
- C语言邻接矩阵的实现
- 图的邻接矩阵(C语言实现)