邻接矩阵、构造有向图
来源:互联网 发布:知乎 军工 编辑:程序博客网 时间:2024/05/17 04:08
/* 邻接矩阵、构造有向图 */#include <cstdio>#include <cstdlib>const int maxv = 20;//INF定义为无穷大,表示不连通const int INF = 9999;bool visited[maxv];/* MGraph类(邻接矩阵构建图类)*/class MGraph{private: typedef struct { int edges[maxv][maxv]; int n,e; }Graph;//定义图类型 Graph *g;//定义图类型变量gpublic: MGraph()//构造函数内,初始化成员g { g = (Graph*)malloc(sizeof(Graph)); } /* 构建图(邻接矩阵) */ void create_MGraph() { printf("输入顶点数,边数(n e): "); scanf("%d%d",&g->n,&g->e); int i,j,w; for(int i = 0; i < g->n; i++) { for(int j = 0; j < g->n; j++) { g->edges[i][j] = INF; } } printf("输入边及权(i j weight):\n"); for(int count = 0; count < g->e; count++) { scanf("%d%d%d",&i,&j,&w); g->edges[i][j] = w; } } /* 打印图(邻接矩阵) */ void print_MGraph() { for(int i = 0; i < g->n; i++) { for(int j = 0; j < g->n; j++) { printf(" %4d ",g->edges[i][j]); } printf("\n"); } } /* 深度优先遍历 */ void dfs(int v) { printf("V%d ",v); visited[v] = 1; int w; for(w = 0; w < g->n; w++) if(g->edges[v][w]!=0 && visited[w] == 0) dfs(w); } /* 广度优先遍历 */ void bfs(int v) { int qu[maxv]; int front = 0,rear = 0; printf("V%d ",v); visited[v] = 1; rear = (rear+1) % maxv; qu[rear] = v; int w; while(front != rear) { front = (front+1) % maxv; w = qu[front]; for(int i = 0; i < g->n; i++) { if(g->edges[w][i] != 0 && visited[i] == 0) { printf("V%d ",i); visited[i] = 1; rear = (rear+1) % maxv; qu[rear] = i; } } } } /* 输出任意顶点V0,到其他顶点的最短路径 */ void Dispath(int dist[],int path[],int S[],int v) { int k,d; for(int i = 0; i < g->n; i++) if(S[i] == 1 && i != v) { printf("V%d->V%d的路径长度为: %d\n",v,i,dist[i]); k = path[i]; if(k == -1) printf("无路径\n"); } } /* Dijkstra算法,求最短路径 */ void Dijkstra(int v) { int dist[maxv],path[maxv]; int S[maxv]; int mindist,u; for(int i = 0; i < g->n; i++) { dist[i] = g->edges[v][i]; S[i] = 0; if(g->edges[v][i] < INF) path[i] = v; else path[i] = -1; } S[v] = 1,path[v] = 0; for(int i = 0; i < g->n; i++) { mindist = INF; for(int j = 0; j < g->n; j++) { if(S[j] == 0 && dist[j] < mindist) { u = j; mindist = dist[j]; } } S[u] = 1; for(int j = 0; j < g->n; j++) { if(S[j] == 0) { if(g->edges[u][j] < INF && dist[u] + g->edges[u][j] < dist[j]) { dist[j] = dist[u] + g->edges[u][j]; path[j] = u; } } } } Dispath(dist,path,S,v); } /* g->n为MGraph类私有成员 只能通过函数访问,获得图的边数n */ int MGraph_n() { return g->n; }};int main(){ MGraph mgraph;//MGraph类,实例化对象mgarph //freopen("data.txt","r",stdin); printf("create MGraph(邻接矩阵类)\n"); mgraph.create_MGraph(); printf("---------------------\n"); printf("print MGraph(邻接矩阵类)\n"); mgraph.print_MGraph(); printf("---------------------\n"); /* 深度优先遍历 */ for(int i = 0; i < mgraph.MGraph_n(); i++) visited[i] = 0; printf("dfs: "); mgraph.dfs(0); printf("\n"); /* 广度优先遍历 */ for(int i = 0; i < mgraph.MGraph_n(); i++) visited[i] = 0; printf("bfs: "); mgraph.bfs(0); printf("\n"); printf("---------------------\n"); /* 输出任意顶点V0,到其他顶点的最短路径 */ mgraph.Dijkstra(0); system("Pause"); return 0;}/*测试用例://(第一组) 4 40 1 91 2 80 2 73 2 6//(第二组) 5 7 0 1 91 2 82 3 73 4 60 2 50 3 40 4 3 */
阅读全文
0 0
- 邻接矩阵、构造有向图
- 邻接矩阵有向图
- 邻接矩阵--有向图
- 构造邻接矩阵,并用邻接矩阵解决有向图的连通性问题
- 有向图邻接矩阵实现
- 邻接矩阵存储有向图
- 邻接矩阵存储有向图
- 有向图的邻接矩阵
- 有向图的邻接矩阵类
- ACM模板--邻接矩阵 有向图
- 有向图的邻接矩阵存储
- 邻接矩阵有向图 之 Java详解
- 图/网-邻接矩阵-有/无 向网
- 有向图的创建(邻接矩阵)
- 邻接矩阵实现的有向图
- 有向图的邻接矩阵的计算
- 邻接矩阵(有向图,无向图实现的差异)
- 无向图有向图邻接矩阵表示法
- 数据结构之两个有序表的合并
- JSP页面代码练习(三)
- h5表单新增元素与属性control、placeholder、list、AutoComplete、pattern、SelectionDirection、indeterminate、
- ubuntu16 idea下安装sdk
- Python中引用类型的应用(Django系列2)
- 邻接矩阵、构造有向图
- Xilinx火龙果学习笔记(2)---vivado工程搭建
- 范数概念
- 1012. 数字分类 (20)
- 简单的检测字符串是否是ip的算法
- LiteIDE中漂亮的几款QSS
- 指针的算术运算
- win10 uwp 后台获取资源
- C++之继承与派生类