PTA路径判断
题目:
思路:
因为是无向图,构造的时候别忘了双向赋值,判断有无路径,可以利用全局变量数组visited,我通过深度优先搜索DFS,从起点i开始搜索,如果走过一个点,更改visited即可,结束搜索后,判断visited[j]是否为1,就可以判断i和j之间是否存在路径了。图的创建可以从函数题里复制粘贴一个适合的上来,改一改变量和读入打印即可。
代码:
#include <stdio.h> #define MVNum 100 //最大顶点数 typedef struct{ char vexs[MVNum]; //存放顶点的一维数组 int arcs[MVNum][MVNum]; //邻接矩阵 int vexnum,arcnum; //图的当前顶点数和弧数 }MGraph; int visited[MVNum]; void CreatMGraph(MGraph *G);/* 创建图 */ void panduan(MGraph *G); //路径判断 void DFS(MGraph *G,int i); //深度搜索 int main() { MGraph G; CreatMGraph(&G); panduan(&G); return 0; } void CreatMGraph(MGraph *G) { int i, j, k; scanf("%d %d",&G->vexnum,&G->arcnum); getchar(); for(i=0;i<G->vexnum;i++){ G->vexs[i] = i; } for(i=0;i<G->vexnum;i++){ for(j=0;j<G->vexnum;j++) G->arcs[i][j] = 0; } for(k=0;k<G->arcnum;k++){ scanf("%d %d",&i,&j); G->arcs[i][j] = 1; G->arcs[j][i] = 1; } } void panduan(MGraph *G){ int i, j, k; scanf("%d %d", &i, &j); for (k=0; k<G->vexnum; k++){ visited[k] = 0; } DFS(G, i); if (visited[j] == 1){ printf("There is a path between %d and %d.", i, j); } else { printf("There is no path between %d and %d.", i, j); } } void DFS(MGraph *G,int i){ int j; visited[i] = 1; //被访问的标记 for(j=0; j<G->vexnum; j++) { if(G->arcs[i][j]==1 && !visited[j]) //边(i,j)存在且j顶点未被访问,递归 DFS(G, j); } }