图的邻接矩阵
来源:互联网 发布:淘宝联盟新增导购推广 编辑:程序博客网 时间:2024/05/18 01:23
#include<stdio.h>#include<stdlib.h>#define MAXVEX 100 //最大顶点数typedef char VertexType; //顶点typedef int EdgeType; //权值#define INFINITY 65535 /*用65535来代表∞*/#define UNVISITED -1 //标记未访问#define VISITED 1 //标记未访问typedef struct{ int from; //边的始点 int to; //边的终点 EdgeType weight; //权重}Edge; //边的结构typedef struct{ int numVertex; //顶点个数 int numEdge; //边的个数 VertexType vexs[MAXVEX]; /*顶点表*/ int Indegree[MAXVEX]; //顶点入度 int Mark[MAXVEX]; //标记是否被访问过 EdgeType arc[MAXVEX][MAXVEX]; //边表}Graph;void InitGraph(Graph * G,int numVert,int numEd ) //传入顶点个数,边数{ G->numVertex=numVert; G->numEdge=numEd; for(int i=0;i<numVert;i++) { G->Mark[i]=UNVISITED; G->Indegree[i]=0; for(int j=0;j<numVert;j++) { G->arc[i][j]=INFINITY; if(i==j) { G->arc[i][j]=0; } } } return ;}//判断是否为边bool IsEdge(Edge oneEdge){ if(oneEdge.weight>0 && oneEdge.weight!=INFINITY && oneEdge.to>=0) { return true; } else { return false; }}//建立无向图的邻接矩阵void CreatUGraph(Graph * G){ int i,j,k,w; printf("请输入%d个顶点元素:\n",G->numVertex); for(i=0;i<G->numVertex;i++) { scanf(" %c",&G->vexs[i]); } for(k=0;k<G->numEdge;k++) { printf("请输入边(Vi,Vj)的下标Vi,Vj,和权重w:\n"); scanf("%d%d%d",&i,&j,&w); G->Indegree[i]++; G->Indegree[j]++; G->arc[i][j]=w; G->arc[j][i]=G->arc[i][j]; }}//建立有向图的邻接矩阵void CreatGraph(Graph * G){ int i,j,k,w; printf("请输入%d个顶点元素:\n",G->numVertex); for(i=0;i<G->numVertex;i++) { scanf(" %c",&G->vexs[i]); } for(k=0;k<G->numEdge;k++) { printf("请输入边(Vi,Vj)的下标Vi,Vj,和权重w:\n"); scanf("%d%d%d",&i,&j,&w); G->Indegree[j]++; G->arc[i][j]=w; }}//返回顶点个数int VerticesNum(Graph * G){ return G->numVertex;}//返回依附于顶点的第一条边Edge FirstEdge(Graph * G,int oneVertex){ Edge firstEdge; firstEdge.from=oneVertex; for(int i=0;i<G->numVertex;i++) { if(G->arc[oneVertex][i]!=0 && G->arc[oneVertex][i]!=INFINITY) { firstEdge.to=i; firstEdge.weight=G->arc[oneVertex][i]; break; } } return firstEdge;} //返回oneEdge的终点int ToVertex(Edge oneEdge){ return oneEdge.to;}//返回与preEdge有相同顶点的下一条边Edge NextEdge(Graph * G,Edge preEdge){ Edge myEdge; myEdge.from=preEdge.from; //边的始点与preEdge的始点相同 if(preEdge.to<G->numVertex) //如果preEdge.to+1>=G->numVertex;将不存在下一条边 for(int i=preEdge.to+1;i<G->numVertex;i++) //找下一个arc[oneVertex][i] { //不为0的i if(G->arc[preEdge.from][i]!=0 && G->arc[preEdge.from][i]!=INFINITY) { myEdge.to=i; myEdge.weight=G->arc[preEdge.from][i]; break; } } return myEdge;}//访问当前的顶点void Vist(Graph * G,int v){ printf("%c ",G->vexs[v]);}//图的深度优先周游(DFS)算法void DFS(Graph * G,int v){ G->Mark[v]=VISITED; Vist(G,v); for(Edge e=FirstEdge(G,v);IsEdge(e);e=NextEdge(G,e)) { if(G->Mark[ToVertex(e)]==UNVISITED) { DFS(G,ToVertex(e)); } }}int main(){ int numVert,numEd; int v; int choose; Graph G; int from,to,weight; printf("请输入顶点个数和边数:\n"); scanf("%d%d",&numVert,&numEd); InitGraph(&G,numVert,numEd); printf("请选择图的类型:\n1.无向图\n2.有向图\n"); scanf("%d",&choose); if(choose==1) { CreatUGraph(&G); } else if(choose==2) { CreatGraph(&G); } else { printf("选择错误!\n"); return 0; } printf("请选择以哪个顶点作为起始点遍历,请输入其下标:\n"); scanf("%d",&v); DFS(&G,v); return 0;}
0 0
- 图的存储-邻接矩阵
- 图的邻接矩阵实现
- 图的邻接矩阵表示
- 图的邻接矩阵
- 图的邻接矩阵
- 图的邻接矩阵存储
- 图的邻接矩阵建立
- 图的邻接矩阵实现
- 图的邻接矩阵表示
- 图的邻接矩阵表示
- 图的邻接矩阵
- 图的邻接矩阵实现
- 图的遍历(邻接矩阵)
- 图邻接矩阵的创建
- 图的邻接矩阵
- 图的邻接矩阵演示
- 图的表示--邻接矩阵
- 图的表示--邻接矩阵
- 应用内升级机制
- webstorm有那些好用的特性
- javascript双等号引起的类型转换
- linux定时器
- 修改form 的字段背景颜色及字体颜色
- 图的邻接矩阵
- 交互设计自查和评估方法
- Putty--登陆后设置标题栏显示IP
- ALSA record wave has noise
- Android在初始化时弹出popwindow的方法
- C 语言可变参数
- 字符编码问题,UNICODE\UTF-8\UTF-16\UTF-32\UCS\ANSI\GBK\GB2312等乱七八糟的名词
- SAT数学题库精选试题
- Mysql常用命令大全