1.采用邻接表或邻接矩阵作存储结构。
2.键盘输入节点个数、名称、边。
3.输出对应的邻接表或邻接矩阵。
4.输出二个遍历结果。
5.利用遍历算法判断图中的两个顶点之间是否存在路径。
#include<bits/stdc++.h>
using namespace std;
#define MAX_NUM 20
typedef struct ArcNode { //表节点
int adjvex; //邻接点
struct ArcNode *nextarc;//指向下一条弧的指针
}ArcNode;
typedef int VertexType;
typedef struct VNode { //头结点
VertexType data;//定点信息
ArcNode *firstarc; //指向第一个依附该顶点的弧的指针
}VNode,AdjList[MAX_NUM]; //邻接链表
void createDgraph(AdjList &g,int n){ //创建图
ArcNode *p,*q;
int i,j;
for (i=1;i<=n;i++)
{
g[i].data=i;
g[i].firstarc=NULL;
}
printf("\nEdgei->j:");
scanf("%d%d",&i,&j);
while (i!=-1)
{
p=(ArcNode *)malloc(sizeof(ArcNode));
q=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=j;
p->nextarc=g[i].firstarc;
g[i].firstarc=p;
q->adjvex=i;
q->nextarc=g[j].firstarc;
g[j].firstarc=q;
printf("\nEdge i->j:");
scanf("%d%d",&i,&j);
}
}
int visited[MAX_NUM]={0};
void DFS(AdjList G,int v){//遍历
ArcNode *p;
visited[v]=1;//已被访问过
printf("%d ",v);
p=G[v].firstarc;
while(p!=NULL){
if(visited[p->adjvex]==0){//若w=p->adjvex 顶点未访问,递归访问它
DFS(G,p->adjvex);
}
p=p->nextarc;//访问过p指向顶点v的下一个邻接点
}
}
void BFS(AdjList G,int v){
ArcNode *p;
int Qu[20],front,rear;//定义循环队列
int visited[20]={0};
int w,i;
front=rear=0;//初始化队列
printf("%d ",v);
visited[v]=1;
rear=(rear+1)%20;
Qu[rear]=v;//v进队
while(front!=rear){
front=(front+1)%20;
w=Qu[front];//出队并赋给w
p=G[w].firstarc;//找与顶点w邻接的第一个顶点
while(p){
if(visited[p->adjvex]==0){//弱当前顶点未被访问
printf("%d ",p->adjvex);//访问邻接顶点
visited[p->adjvex]=1;
rear=(rear+1)%20;//该顶点进队
Qu[rear]=p->adjvex;
}
p=p->nextarc;
}
}
}
void printDgraph(AdjList g,int n){ //输出图的访问节点
ArcNode *p;
int i;
for (i=1;i<=n;i++)
{
printf("\n%d: ",g[i].data);
p=g[i].firstarc;
while (p)
{
printf("->%d",p->adjvex);
p=p->nextarc;
}
}
}
int juiceroad(AdjList g,int n,int x,int y){
ArcNode *p;
for(int i=1;i<=n;i++){
if(g[i].data==x)
{
p=g[i].firstarc;
while(p){
if(p->adjvex==y){
//printf("存在一条这样的路径!");
return 1;
}
else p=p->nextarc;
}
}
}
return 0;
}
int main()
{
AdjList g;
int num;
printf("输入图的节点的个数");
scanf("%d",&num);
createDgraph(g,num);
printf("输出无向图的邻接表(访问路径):");
printDgraph(g,num);
printf("\n");
printf("深度优先:");
DFS(g,num);
printf("\n");
printf("广度优先:");
BFS(g,num);
printf("\n");
int x, y;
while(~scanf("%d%d",&x,&y)){
int result=juiceroad(g,num,x,y);
if(result) printf("存在一条这样的路径!\n");
else printf("不存在一条这样的路径\n");
}
return 0;
}