记数据结构简单课设之无向图的简单路径

只有两点要求:


1)求出无向图中从起点到终点的所有简单路径。其中起点和终点可以由用户自行设定。

2)求出无向图中从起点到终点的指定长度(如K)的所有简单路径。其中起点和终点可以由用户自行设定。


#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define MAXV 100  //最大顶点个数
int visited[MAXV];
//邻接矩阵类型
typedef struct
{
    int no;  //顶点号
    int info; //边的权值
}Vertextype;   //顶点类型
typedef struct
{
    int edges[MAXV][MAXV];//邻接矩阵
    int n,e;  //顶点数,弧数
    Vertextype vexs[MAXV];//顶点信息
}Mgraph;
//邻接表信息
typedef struct Anode   //弧结点
{
    int adjvex;  //终点
    struct Anode *next;//下一条弧
    int  info;//弧权值

}ArcNode;
typedef struct Vnode
{
    int data;  //邻接表的头结点
    ArcNode * first;//第一条弧
}Vnode;
typedef struct
{
    Vnode adjlist[MAXV];//邻接表
    int n,e;//定点数,弧数
}AlGraph;
void Change(Mgraph g,AlGraph *&G)//将邻接矩阵转换为邻接表
{
     int i,j,n =g.n;
     ArcNode *p;
     G= (AlGraph *)malloc(sizeof(AlGraph));
     for(i=0;iadjlist[i].first = NULL;

     }
      for(i=0;i=0;j--)   //依次遍历邻接矩阵存到响应的邻接表
       {
          if(g.edges[i][j]!=0)
          {
              p=(ArcNode *)malloc(sizeof(ArcNode));
              p->adjvex = j;//弧的后一个点
              p->info = g.edges[i][j];//权值
              p->next = G->adjlist[i].first;
              G->adjlist[i].first = p;//接到每一行头结点的后面
          }
       }
    G->n = n;//顶点数
    G->e =g.e;//弧数
}
void DisADJ(AlGraph *G)//输出邻接表
{
    int i;
    ArcNode *p;
    printf("************邻接表如下*************\n");
    for(i = 0;in;i++)
    {
        p=G->adjlist[i].first;//从每一行的头结点向后面遍历
        if(p!=NULL)printf("%d: ",i);
        while(p!=NULL)
        {
            printf("%3d",p->adjvex);
            p=p->next;
        }
        printf("\n");
    }
}
void showways1(AlGraph *G,int x,int y,int path[],int i)//利用邻接表求
{

    ArcNode *p;
    int j,n;
    visited[x] = 1;//记录已经用过这个顶点
    p=G->adjlist[x].first;
    while(p!=NULL)
    {
        n=p->adjvex;
        if(n==y)   //找到一个路径
        {
            path[i+1] = y;
            for(j=0;j<=i+1;j++)
                printf("  %3d",path[j]);
            printf("\n");

        }
        else  if(visited[n]==0)     //该点未被遍历
        {
            path[i+1] = n;//存入路径
            showways1(G,n,y,path,i+1);  //递归
        }
        p=p->next;
    }
    visited[x] =0;

}
void showways2(Mgraph g,int x,int y,int path[],int i)//利用邻接矩阵求
{
    visited[x]=1;//标记该点
    int j;
    path[i] = x;//存入路径
    for(j = 0;jadjlist[x].first;
    while(p!=NULL)   //递归循环查找
    {
        m = p->adjvex;
        if(visited[m]==0)//未遍历的点
            showways3(G,m,y,l,path,d);
        p=p->next;

    }
     visited[x] = 0;
}
void showways4(Mgraph g,int x,int y,int l,int path[],int d)
{

    visited[x]=1;
    int j;
    d++;
    path[d] = x;
    for(j = 0;j>g.edges[i][j];

       }
       break;
    }

  }
  G =(AlGraph *)malloc(sizeof(AlGraph));
  Change(g,G);  //转换成邻接表
  DisADJ(G);//输出邻接表
  printf("****************选择***********************\n\n");
  int k,u,v,m;
  int path[MAXV];
  printf("1.代表求出无向图中从起点到终点的所有简单路径\n\n");
  printf("2.代表无向图中从起点到终点的指定长度的所有简单路径\n\n");
  printf("**********************************************\n");
  while(true){
     for(i=0;i


你可能感兴趣的:(c++学习)