我是靠谱客的博主 贪玩金毛,最近开发中收集的这篇文章主要介绍图的基本操作--邻接矩阵类型,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本文作者:韩申权
作者博客:http://www.cnblogs.com/hsqdboke
转载请注明出处,侵权必究,保留最终解释权!

程序1

/* 定义邻接矩阵类型 */

typedef int  adjmatrix[n+1][n+1];

 

/* 建立图的邻接矩阵 */

void CreatMatrix(adjmatrix GA)

 

/* 从初始点v出发深度优先遍历邻接矩阵GA表示的图 */

void DfsMatrix(adjmatrix GA,int v)

 

/*从初始点v出发广度优先遍历邻接矩阵GA表示的图*/

void BfsMatrix(adjmatrix GA,int v)

例如:

//2012年5月22日20:37:07
//用邻接矩阵构造一个无向图 并进行DFS和BFS搜索
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_V 20 //定义最大顶点数20
#define OVERFLOW -1
int p=1,q=1;
int visited[21];
char ver[21][10];
typedef int adjmatrix[MAX_V+1][MAX_V+1];
typedef int QElemType;
typedef struct
{
adjmatrix d;
int v,e;
}Graph;
void CreateG(adjmatrix d,int n,int e)
{
int i,j,k;
printf("请分别输入顶点1到顶点%d的信息:",n);
for(i=1;i<=n;i++)
{
//getchar();
scanf("%s",ver[i]);
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
d[i][j]=0;
for(k=1;k<=e;k++)
{
printf("请输入第%d条边的信息:",k);
scanf("%d%d",&i,&j);
//i和j分别为边的两个顶点
if(i>n||j>n)exit(OVERFLOW);
d[i][j]=1;
d[j][i]=1;
}
}
int FAV(adjmatrix d,int v,int n)//求第一个邻接点v为当前顶点 n为总的顶点数

{
int i;
for(i=1;i<=n;i++)
if(d[v][i]==1)return i;
return 0;
}
int NAV(adjmatrix d,int v,int w,int n)//求相对于其邻接点w的下一个邻接点,w为v的当前邻接点
{
int i;
for(i=w+1;i<=n;i++)
if(d[v][i]==1)return i;
return 0;
}
void visit(int v)
{
if(p)
{printf("%s",ver[v]);p=0;}
else
printf("->%s",ver[v]);
}
void visit1(int v)
{
if(q)
{printf("%s",ver[v]);q=0;}
else
printf("->%s",ver[v]);
}
void DFS(adjmatrix d,int v,int n)
{
int w;
visited[v]=1;
visit(v);
for(w=FAV(d,v,n);w;w=NAV(d,v,w,n))
if(!visited[w])DFS(d,w,n);
}
void DFSTraverse(adjmatrix d,int v,int n)//v为初始点
{
int i;
memset(visited,0,sizeof(visited));
printf("从初始点%d进行DFS的结果为:n",v);
DFS(d,v,n);
for(i=1;i<=n;i++)
if(!visited[i])DFS(d,i,n);
printf("n");
}
//BFS函数需要的基本函数
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode ,*Queuep;
typedef struct
{
Queuep front;
Queuep rear;
}LinkQueue;
void InitQueue(LinkQueue *Q) //初始队列
{
Q->front=Q->rear=(Queuep)malloc(sizeof(QNode));
if(!Q->front)exit(OVERFLOW);
Q->front->next=NULL;
}
int QueueEmpty(LinkQueue *Q)//判空
{
if(Q->front==Q->rear)return 1;
else return 0;
}
void Enqueue (LinkQueue *Q,QElemType e)//添加元素到队尾
{
Queuep p;
p=(Queuep)malloc(sizeof(QNode));
if(!p)exit(OVERFLOW);
p->data=e;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
}
void Dequeue(LinkQueue *Q,QElemType *e)//删除队首元素
{
Queuep p;
p=Q->front->next;
*e=p->data;
Q->front->next=p->next;
if(Q->rear==p)Q->rear=Q->front;
free(p);
}
void BFSTraverse(adjmatrix d,int v,int n) //BFS遍历图
{
int i,w,u;
LinkQueue Q;
memset(visited,0,sizeof(visited));
printf("从初始点%d进行BFS的结果为:n",v);
InitQueue(&Q);
visited[v]=1;
visit1(v);
Enqueue(&Q,v);
while(!QueueEmpty(&Q))
{
Dequeue(&Q,&u);
for(w=FAV(d,u,n);w;w=NAV(d,u,w,n))
if(!visited[w])
{
visited[w]=1;
visit1(w);
Enqueue(&Q,w);
}
}
for(i=1;i<=n;i++)
if(!visited[i])
{
visited[i]=1;
visit1(i);
Enqueue(&Q,i);
while(!QueueEmpty(&Q))
{
Dequeue(&Q,&u);
for(w=FAV(d,u,n);w;w=NAV(d,u,w,n))
if(!visited[w])
{
visited[w]=1;
visit1(w);
Enqueue(&Q,w);
}
}
}
printf("n");
}
int main()
{
Graph G;
int vf;
printf("请分别输入顶点数、边数: ");
scanf("%d%d",&G.v,&G.e);
printf("请输入DFS的初始点:");
scanf("%d",&vf);
CreateG(G.d,G.v,G.e);
DFSTraverse(G.d,vf,G.v);
BFSTraverse(G.d,vf,G.v);
printf("n");
return 0;
}

本文作者:韩申权
作者博客:http://www.cnblogs.com/hsqdboke
转载请注明出处,侵权必究,保留最终解释权!

转载于:https://www.cnblogs.com/hsqdboke/archive/2012/05/22/2513921.html

最后

以上就是贪玩金毛为你收集整理的图的基本操作--邻接矩阵类型的全部内容,希望文章能够帮你解决图的基本操作--邻接矩阵类型所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部