似乎是判断一个图有没有环~
资料上有这种算法的~
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<assert.h> #define MaxVertexNum 20 #define LEN sizeof(EdgeNode) #define INF 999 //定义无穷大/****************图的邻接矩阵定义 *******************/ typedef char VertexType; //VertexType----顶点内容 typedef int EdgeType; //EdgeType----顶点信息 typedef struct //邻接矩阵 { VertexType vexs[MaxVertexNum]; //邻接矩阵顶点内容 EdgeType visit[MaxVertexNum]; EdgeType edges[MaxVertexNum][MaxVertexNum]; //邻接矩阵列表 int n; //n为顶点数 int e;//e为边数 }MGraph; //定义邻接矩阵/****************图的邻接表定义 *******************/ typedef struct node //邻接表节点 { VertexType adjvex; //所在的顶点 EdgeType info; //顶点信息 struct node *next; //邻接表指针 } EdgeNode; //定义邻接表 typedef struct vnode { VertexType vertex; //顶点信息 EdgeType visit; //遍历标记 EdgeNode* firstedge; //第一个顶点指针 }VertexNode; typedef struct { int n; //顶点数 int e; //边数 VertexNode AdjList[MaxVertexNum]; //邻接表的保存信息 }ALGraph; //邻接表/****************图的创建与打印 *******************/ void CreateMGraph(MGraph* G) { int i=0; int j=0; int k=0; printf("请输入顶点数和边数(输入格式为:顶点数,边数):\n"); assert(scanf("%d%*c%d",&(G->n),&(G->e))==2); /*输入顶点数和边数*/ getchar(); printf("请输入顶点信息(输入格式为:顶点号<CR>):\n"); for (i=0;i<G->n;i++) assert(scanf("%c%*c",&(G->vexs[i]))==1); /*输入顶点信息,建立顶点表*/ for (i=0;i<G->n;i++) { G->visit[i]=0; /*初始化遍历内容*/ for (j=0;j<G->n;j++) G->edges[i][j]=0; /*初始化邻接矩阵*/ } printf("请输入每条边对应的两个顶点的序号(输入格式为:i,j):\n"); for (k=0;k<G->e;k++) { assert(scanf("%d%*c%d",&i,&j)==2); /*输入e条边,建立邻接矩阵*/ G->edges[i][j]=1; /*若加入G->edges[i][j]=1*/ /*G->edges[j][i]=1; */ /*则为无向图的邻接矩阵存储建立 */ } getchar(); } void printMGraph(MGraph* G) { int i=0; int j=0; printf(" "); for (i=0;i<G->n;++i) printf("%c ",G->vexs[i]); puts(""); for (i=0;i<G->n;++i) { printf("%c->",G->vexs[i]); for (j=0;j<G->n;j++) printf("%d ",G->edges[i][j]); puts(""); } } void Creat_Node(EdgeNode** node,int size) { *node=(struct node*)malloc(LEN); assert(*node); memset(*node,0,size); } void MGraphtoALGraph(MGraph* mG,ALGraph* alG) //邻接矩阵转化为邻接表 { int i=0; int j=0; EdgeNode* p=NULL; alG->e=mG->e; alG->n=mG->n; for (i=0;i<mG->n;++i) { Creat_Node(&p,LEN); alG->AdjList[i].firstedge=p; alG->AdjList[i].vertex=mG->vexs[i]; alG->AdjList[i].firstedge->info=i; alG->AdjList[i].visit=0; for (j=0;j<mG->n;++j) if (mG->edges[i][j]) { EdgeNode* new_p=NULL; Creat_Node(&new_p,LEN); new_p->adjvex=mG->vexs[j]; new_p->info=j; p=p->next=new_p; } } } void printALGraph(ALGraph* alG) //打印邻接表 { EdgeNode* p=NULL; int i=0; for (i=0;i<alG->n;++i) { p=alG->AdjList[i].firstedge; printf("%c->",alG->AdjList[i].vertex); while (p) { printf("%c ",p->adjvex); p=p->next; } puts(""); } }/****************图的深度优先遍历 *******************/ void MG_DFSTraverse(MGraph* mG,EdgeType Col) //矩阵的列 { int i=0; mG->visit[Col]=1; printf("vertex->%c\n",mG->vexs[Col]); for (i=0;i<mG->n;++i) if (mG->visit[i]==0&&mG->edges[Col][i]==1) MG_DFSTraverse(mG,i); } void ALG_DFSTraverse(ALGraph* alG,int i) { EdgeNode* p=alG->AdjList[i].firstedge; if (p==NULL) return ; alG->AdjList[i].visit=1; printf("vertex->%c\n",alG->AdjList[i].vertex); while (p=p->next) if (alG->AdjList[p->info].visit==0) ALG_DFSTraverse(alG,p->info); } /****************图的广度优先遍历 *******************/ void MG_BFSTraverse(MGraph* mG,EdgeType n) { EdgeType queue[MaxVertexNum]={0}; //用队列来保存顶点信息 EdgeType count[MaxVertexNum]={0}; //步长信息 EdgeType step=1; //步长 EdgeType front=0; //队头指针 EdgeType rear=0; //队尾指针 int Row=n; printf("步长->%-3dvertex->%c\n",step,mG->vexs[Row]); queue[rear++]=Row; //第一个顶点入队 count[rear-1]=step; mG->visit[Row]=1; //标记此顶点已经遍历 while (front!=rear) //当队列不为空时 { if (count[front]==step) ++step; for (Row=0;Row<mG->n;++Row) if (mG->visit[Row]==0&&mG->edges[queue[front]][Row]==1) { printf("步长->%-3dvertex->%c\n",step,mG->vexs[Row]); queue[rear++]=Row; rear%=MaxVertexNum; assert(front!=rear+1); //判断队满 count[rear-1]=step; //记录步长 mG->visit[Row]=1; } ++front; front%=MaxVertexNum; } } void ALG_BFSTraverse(ALGraph* alG,int n) { EdgeType queue[MaxVertexNum]={0}; //用队列来保存顶点信息 EdgeType count[MaxVertexNum]={0}; //步长信息 EdgeType step=1; //步长 EdgeType front=0; //队头指针 EdgeType rear=0; //队尾指针 EdgeNode* p=alG->AdjList[n].firstedge; printf("步长->%-3dvertex->%c\n",step,alG->AdjList[p->adjvex]); queue[rear++]=p->info; //第一个顶点入队 count[rear-1]=step; alG->AdjList[p->info].visit=1; //标记此顶点已经遍历 while (front!=rear) { if (count[front]==step) ++step; p=alG->AdjList[queue[front]].firstedge; while (p=p->next) if (alG->AdjList[p->info].visit==0) { printf("步长->%-3dvertex->%c\n",step,alG->AdjList[p->info].vertex); queue[rear++]=p->info; //入队 rear%=MaxVertexNum; assert(front!=rear+1); //判断队满 count[rear-1]=step;//记录步长 alG->AdjList[p->info].visit=1; } ++front; front%=MaxVertexNum; } } /****************************************辅助函数*************************************/ EdgeType Search(MGraph* mG,VertexType c) { int i=0; for (i=0;i<mG->n;++i) if (mG->vexs[i]==c) return i; return -1; } void Empty_MG_Visit(MGraph* mG) { int i=0; for (i=0;i<mG->n;++i) mG->visit[i]=0; } void Empty_ALG_Visit(ALGraph* alG) { int i=0; for (i=0;i<alG->n;++i) alG->AdjList[i].visit=0; }/****************************************main函数*************************************/ int main() { MGraph G={0}; ALGraph alG={0}; int point=0; VertexType sc=0; CreateMGraph(&G); printMGraph(&G); MGraphtoALGraph(&G,&alG); puts("邻接表示例如下:"); printALGraph(&alG); //邻接矩阵深度优先搜索 puts("\n图的深度优先搜索:"); printf("请输入查找起点搜索名称:"); scanf("%c%*c",&sc); point=Search(&G,sc); if (point!=-1) { puts("\n邻接矩阵的深度优先搜索结果:"); MG_DFSTraverse(&G,point); puts("\n邻接表的深度优先搜索结果:"); ALG_DFSTraverse(&alG,point); } else puts("找不到该顶点信息!"); Empty_MG_Visit(&G);//重置搜索状态 Empty_ALG_Visit(&alG); puts("\n图的广度优先搜索:"); printf("请输入查找起点搜索名称:"); scanf("%c%*c",&sc); point=Search(&G,sc); if (point!=-1) { puts("\n邻接矩阵的广度优先搜索结果:"); MG_BFSTraverse(&G,point); puts("\n邻接表的广度优先搜索结果:"); ALG_BFSTraverse(&alG,point); } else puts("找不到该顶点信息!"); return 0; }
void MG_DFSTraverse(MGraph* mG,EdgeType Col) //矩阵的列 { int i=0; mG->visit[Col]=1; printf("vertex->%c\n",mG->vexs[Col]); for (i=0;i<mG->n;++i) if (mG->visit[i]==0&&mG->edges[Col][i]==1) MG_DFSTraverse(mG,i); }
void MG_DFSTraverse(MGraph* mG,EdgeType Col) //矩阵的列 { int i=0; mG->visit[Col]=1; printf("vertex->%c\n",mG->vexs[Col]); for (i=0;i<mG->n;++i) if (mG->visit[i]==0&&mG->edges[Col][i]==1) MG_DFSTraverse(mG,i); else if (mG->visit[i]==1&&mG->edges[Col][i]==1) puts("这个图存在环!"); }
[此贴子已经被作者于2018-3-19 01:00编辑过]