數據結構文章推薦: |
---|
👉 順序表和鏈表實現圖書管理系統 |
👉 指針如何賦值?關於指針的理解 |
👉 多種方式實現英文單詞詞頻統計和檢索系統 |
👉 待更新 |
內容要求:
試基於圖的深度優先搜索策略寫一個算法,判別以鄰接表方式存儲的有向圖中是否存在由頂點vi到頂點vj的路徑(i≠j)。並請設計程序測試該算法的有效性。
代碼實現(僅供參考):
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100 //最大邊數
typedef struct ArcNode{//弧結點
int ajdVex; //弧終點指針位置
ArcNode* next; //下一條弧的指針
};
typedef struct Node{//頂點結點
ArcNode* Arc; //指向依附該頂點的弧指針
};
typedef struct Graph{//鄰接表
Node adjlist[MAXN]; //點集
bool visited[MAXN]; //是否被遍歷
int n,m; //頂點數和弧數
};
Graph *G = (Graph*)malloc(sizeof(Graph));
int i,j,k;bool hasPath = false;
void createLink(){//創建鄰接表
printf("請輸入頂點數n 弧數m:");
scanf("%d %d",&G->n,&G->m);
printf("創建的所有點:");
for(i=0;i<G->n;i++){ G->adjlist[i].Arc = 0;printf("V%d ",i);}printf("\n");
for(j=0;j<G->m;j++){
printf("第%d條弧起點編號、終點編號:",j+1);
scanf("%d %d",&i,&k);
ArcNode *p = (ArcNode*)malloc(sizeof(ArcNode));
p->ajdVex = k; //將邊所指向的點編號賦值
p->next = G->adjlist[i].Arc;
G->adjlist[i].Arc = p;
}
}
void print_Graph(){//輸出鄰接表
ArcNode *p;
for(i=0;i<G->n;i++){
p = G->adjlist[i].Arc;
printf("V%d",i);
while(p){
printf("->V%d",p->ajdVex);
p = p->next;
}printf("\n");
}
}
void existPath(int d,int z){//兩點是否連通
G->visited[d] = true;
ArcNode *p = G->adjlist[d].Arc;
if(d == z)hasPath = true;
while(p){
if(p->ajdVex==z)hasPath = true;
if(!G->visited[p->ajdVex])existPath(p->ajdVex,z);
p = p->next;
}
}
void print_Path(int d,int z){//輸出兩點連接路徑
ArcNode *p = G->adjlist[d].Arc;
printf("路徑爲:V%d",d);
while(p){
printf("->V%d",p->ajdVex);
if(p->ajdVex == z)break;
p = G->adjlist[p->ajdVex].Arc;
}printf("\n");
}
void setFlase(){//visited置零
hasPath = false;
for(i=0;i<G->n;i++) G->visited[i] = false;
}
int main(){
createLink();
while(true){printf("\n");
printf("請輸入操作(1.打印信息 2.判斷路徑 3.退出):");
int choice; scanf("%d",&choice);setFlase();
if(choice == 1) print_Graph();
if(choice == 2){
printf("請輸入兩點編號:"); scanf("%d %d",&i,&k);existPath(i,k);
if(hasPath){printf("兩點連通!\n");print_Path(i,k);}
else printf("兩點不連通!\n");
}
if(choice == 3)break;
}
return 0;
}
實現效果:
這個問題專門考察了我們對深度優先搜索的使用熟練程度,同時也加深了我們對圖的操作。
最後,如果有問題的話歡迎交流!有幫助的話別忘了支持一下哦! 👍👍👍