【第12周 项目2 - 操作用邻接表存储的图】
2015-11-30 16:27
337 查看
问题及代码
/* Copyright (c)2015,烟台大学计算机与控制工程学院 All rights reserved. 文件名称:邻接表存储的图.cpp 作 者:张耀 完成日期:2015年11月30日 版 本 号:v1.0 问题描述: 假设图G采用邻接表存储,分别设计实现以下要求的算法 输入描述:若干测试数据。 程序输出:DFS,BFS的遍历序列。 */
图基本算法库
(1)输出出图G中每个顶点的出度代码:
#include "graph.h" //返回图G中编号为v的顶点的出度 int OutDegree(ALGraph *G,int v) { ArcNode *p; int n=0; p=G->adjlist[v].firstarc; while (p!=NULL) { n++; p=p->nextarc; } return n; } //输出图G中每个顶点的出度 void OutDs(ALGraph *G) { int i; for (i=0; i<G->n; i++) printf(" 顶点%d:%d\n",i,OutDegree(G,i)); } int main() { ALGraph *G; int A[7][7]= { {0,1,1,1,0,0,0}, {0,0,0,0,1,0,0}, {0,0,0,0,1,1,0}, {0,0,0,0,0,0,1}, {0,0,0,0,0,0,0}, {0,0,0,1,1,0,1}, {0,1,0,0,0,0,0} }; ArrayToList(A[0], 7, G); printf("各顶点出度:\n"); OutDs(G); return 0; }
运行结果
(2)求出图G中出度最大的一个顶点,输出该顶点编号代码:
#include "graph.h" //返回图G中编号为v的顶点的出度 int OutDegree(ALGraph *G,int v) { ArcNode *p; int n=0; p=G->adjlist[v].firstarc; while (p!=NULL) { n++; p=p->nextarc; } return n; } //输出图G中每个顶点的出度 void OutDs(ALGraph *G) { int i; for (i=0; i<G->n; i++) printf(" 顶点%d:%d\n",i,OutDegree(G,i)); } //输出图G中出度最大的一个顶点 void OutMaxDs(ALGraph *G) { int maxv=0,maxds=0,i,x; for (i=0; i<G->n; i++) { x=OutDegree(G,i); if (x>maxds) { maxds=x; maxv=i; } } printf("顶点%d,出度=%d\n",maxv,maxds); } int main() { ALGraph *G; int A[7][7]= { {0,1,1,1,0,0,0}, {0,0,0,0,1,0,0}, {0,0,0,0,1,1,0}, {0,0,0,0,0,0,1}, {0,0,0,0,0,0,0}, {0,0,0,1,1,0,1}, {0,1,0,0,0,0,0} }; ArrayToList(A[0], 7, G); printf("最大出度的顶点信息:"); OutMaxDs(G); return 0; }
运行结果
(3)计算图G中出度为0的顶点数;代码:
#include "graph.h" //返回图G中编号为v的顶点的出度 int OutDegree(ALGraph *G,int v) { ArcNode *p; int n=0; p=G->adjlist[v].firstarc; while (p!=NULL) { n++; p=p->nextarc; } return n; } //输出图G中每个顶点的出度 void OutDs(ALGraph *G) { int i; for (i=0; i<G->n; i++) printf(" 顶点%d:%d\n",i,OutDegree(G,i)); } //输出图G中出度为0的顶点数 void ZeroDs(ALGraph *G) { int i,x; for (i=0; i<G->n; i++) { x=OutDegree(G,i); if (x==0) printf("%2d",i); } printf("\n"); } int main() { ALGraph *G; int A[7][7]= { {0,1,1,1,0,0,0}, {0,0,0,0,1,0,0}, {0,0,0,0,1,1,0}, {0,0,0,0,0,0,1}, {0,0,0,0,0,0,0}, {0,0,0,1,1,0,1}, {0,1,0,0,0,0,0} }; ArrayToList(A[0], 7, G); printf("出度为0的顶点:"); ZeroDs(G); return 0; }
运行结果
(4)判断图G中是否存在边
#include "graph.h" //返回图G中编号为v的顶点的出度 int OutDegree(ALGraph *G,int v) { ArcNode *p; int n=0; p=G->adjlist[v].firstarc; while (p!=NULL) { n++; p=p->nextarc; } return n; } //输出图G中每个顶点的出度 void OutDs(ALGraph *G) { int i; for (i=0; i<G->n; i++) printf(" 顶点%d:%d\n",i,OutDegree(G,i)); } //输出图G中出度最大的一个顶点 void OutMaxDs(ALGraph *G) { int maxv=0,maxds=0,i,x; for (i=0; i<G->n; i++) { x=OutDegree(G,i); if (x>maxds) { maxds=x; maxv=i; } } printf("顶点%d,出度=%d\n",maxv,maxds); } //输出图G中出度为0的顶点数 void ZeroDs(ALGraph *G) { int i,x; for (i=0; i<G->n; i++) { x=OutDegree(G,i); if (x==0) printf("%2d",i); } printf("\n"); } //返回图G中是否存在边<i,j> bool Arc(ALGraph *G, int i,int j) { ArcNode *p; bool found = false; p=G->adjlist[i].firstarc; while (p!=NULL) { if(p->adjvex==j) { found = true; break; } p=p->nextarc; } return found; } int main() { ALGraph *G; int A[7][7]= { {0,1,1,1,0,0,0}, {0,0,0,0,1,0,0}, {0,0,0,0,1,1,0}, {0,0,0,0,0,0,1}, {0,0,0,0,0,0,0}, {0,0,0,1,1,0,1}, {0,1,0,0,0,0,0} }; ArrayToList(A[0], 7, G); printf("边<2,6>存在吗?"); if(Arc(G,2,6)) printf("是\n"); else printf("否\n"); printf("\n"); return 0; }
运行结果
知识点总结:
图算法库的应用。学习心得:
一步步的实现这个程序有过程感。相关文章推荐
- (第十周项目3)利用二叉树遍历思想解决问题
- 第十四周项目--递归的折半查找
- 开源项目源码解析-PhotoView 源码解析
- javaweb 复习系列(三)
- [转]Servlet 3.0 新特性详解
- 第13周项目3-Dijkstra算法的验证
- 第十四周项目1 验证算法
- 第15周 项目1—(2)直接插入排序
- Android 蓝牙BLE (蓝牙成长之路)5
- Failed to fetch all URIs for container
- 第12周项目3-图遍历算法实现
- Oracle 12c迁移pluggable database到异库
- 第14周项目1——验证算法(折半查找)
- Masonry自动布局详解一:基本用法
- 一锅乱炖(二)
- php中static关键字的用法(未完)
- Windows下测量cpu利用率的类
- 第14周实践项目(3)-验证二叉排序树
- 十四周 项目一-折半查找
- 第十一周项目1 验证算法1层次算法遍历的验证