1. 程式人生 > >採用鄰接表儲存結構,編寫一個判別無向圖中任意給定的兩個頂點之間是否存在一條長度為k的簡單路徑的演算法。

採用鄰接表儲存結構,編寫一個判別無向圖中任意給定的兩個頂點之間是否存在一條長度為k的簡單路徑的演算法。

問題描述:試基於圖的深度優先搜尋策略編寫一程式,判別以鄰接表儲存的有向圖中是否存在有頂點Vi到Vj頂點的路徑(i!=j)。

輸入:頂點個數,邊數。頂點,邊,要找的頂點i到j。

輸出:若存在i到j路徑,輸出Exist the path,否則輸出Not exist the path。

儲存結構:鄰接表儲存結構。

演算法基本思想:建立鄰接表儲存各頂點,邊。然後深度優先搜尋,用visited[i]作標誌。

源程式:

#include "stdio.h"

#include "conio.h"

#define MAX_VERTEX_NUM 30

typedef struct ArcNode{

     int adjvex;

     struct ArcNode *nextarc;

}ArcNode;

typedef struct VNode{

     int data;

     ArcNode *firstarc;

}VNode,AdjList[MAX_VERTEX_NUM];

typedef struct{

     AdjList vertices;

     int vexnum,arcnum;

}ALGraph;

creat_DG_ALGraph(ALGraph *G){

   int i,j,k;ArcNode *p;

   p=NULL;

   printf("Please input: vexnum ,arcnum=:");

   scanf("%d,%d",&G->vexnum,&G->arcnum);

   printf("Please input VNode:\n");

   for(i=0;i<G->vexnum;i++)

     {scanf("%d",&G->vertices[i].data);

      G->vertices[i].firstarc=NULL;

     }

   for(i=0;i<G->vexnum;i++)

     printf("%d ",G->vertices[i].data);

   printf("\n");

   for(k=0;k<G->arcnum;k++)

       {p=(ArcNode*)malloc(sizeof(ArcNode));

        printf("please input edge <i,j>: ");

        scanf("%d,%d", &i, &j);

        printf("\n");

        p->adjvex = j;

        p->nextarc=G->vertices[i].firstarc;

        G->vertices[i].firstarc=p;

       }

}

int exist_path_DFS(ALGraph G,int i,int j){

    ArcNode *p;

    int k,visited[MAX_VERTEX_NUM];

    p=NULL;

    if(i==j) return 1;

    else {visited[i]=1;

          for(p=G.vertices[i].firstarc;p;p=p->nextarc)

             {k=p->adjvex;

              if(!visited[k]&&exist_path_DFS(G,k,j));

             }

          }

}

main()

{ALGraph *G;

int i,j;

G=NULL;

creat_DG_ALGraph(G);

printf("Please input i->j you want to find:\n");

scanf("%d,%d",&i,&j);

if(exist_path_DFS(*G,i,j)) printf("Exist the path!");

else printf("Not exist the path");

getch();

}