设G=(V,E)是一个连通图,已知图中两个顶点 i 属于V,j 属于V,请设计一个算法给出从顶点i到顶点j的所有简单路径。
解题思路:jt首先要掌握建立图,包括结构体定义和建图的过程。主要考察的是DFS深搜算法。
DFS邻接表时间复杂度为O(|V|+|E|)
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int MAXN=100;//顶点数据的最大值
struct ArcNode//边表结点
{
int adjvex;//该弧所指向的顶点的位置
ArcNode *nextarc;//指向下一条弧的指针
};
struct Vnode//顶点表结点
{
int data;//顶点信息
ArcNode *firstarc;//指向第一条依附该顶点的弧的指针
};
struct graph//以邻接表存储的图类型
{
Vnode adjlist[MAXN];//邻接表(顶点集) 因为顶点结构体中存由指向弧的指针,所以只存顶点集即可
int n,e;//图的顶点数和弧数
};
graph *g=(graph *)malloc(sizeof(graph));//建立头指针
void creategraph(graph *g)
{
printf("n,e = ");
scanf("%d %d",&g->n,&g->e);
for(int k=1;k<=g->n;k++)//建立顶点表结点
{
g->adjlist[k].data=k;
g->adjlist[k].firstarc=NULL;
}
printf("输入边的from和to\n");
int i,j;
for(int k=1;k<=g->e;k++)
{
scanf("%d %d",&i,&j);
ArcNode *p=(ArcNode *)malloc(sizeof(ArcNode));//边表指针
p->adjvex =j;
p->nextarc=g->adjlist[i].firstarc;//头插
g->adjlist[i].firstarc=p;
}
}
void print(graph *g)
{
for(int k=1;k<=g->n;k++)
{
printf("%d ",g->adjlist[k].data);
ArcNode *p=g->adjlist[k].firstarc;
while(p!=NULL)
{
printf("%d ",p->adjvex);
p=p->nextarc;
}
printf("\n");
}
}
int path[MAXN];//存储路径
int visit[100];//标记数组
void DFS(graph g,int v,int to,int d)
{
visit[v]=1;//标记当前结点已访问
path[++d]=v;//存入路径数组
if(v==to&&d>1)//如当前结点是要寻找的重点
{
for(int k=0;k<=d;k++)//输出路径
{
printf("%d ",path[k]);
}
printf("\n");
}
ArcNode *p=g.adjlist[v].firstarc;//p指向当前结点第一个邻接结点
while(p!=NULL)
{
if(visit[p->adjvex]==0)//若当前结点未被访问
{
DFS(g,p->adjvex,to,d);//遍历邻接结点
}
p=p->nextarc;//下一个邻接结点
}
visit[v]=0;//标记当前结点为未访问
}
int main()
{
memset(path,0,sizeof(path));
memset(visit,0,sizeof(visit));
creategraph(g);
print(g);
DFS(*g,1,5,-1);
return 0;
}
/*
1 2
1 4
4 2
2 5
5 4
3 5
3 6
6 6
*/