題目:
思路:
因為是無向圖,構造的時候別忘了雙向賦值,判斷有無路徑,可以利用全局變量數組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); } }