📄 所有路径.cpp
字号:
#include <stdio.h>
#include <malloc.h>
#define max 15
typedef struct graph
{
int vexs[max];
int arcs[max][max];
int n;
int e;
}graph;
void creatgraph(graph *g)
{
int i,j,k;
printf("请输入顶点个数和边数(不大于15)\n");
scanf("%d%d",&(g->n),&(g->e));//n,e
for (i=0;i<(g->n);i++)
{
g->vexs[i]=i; //建立顶点,注意是从0开始!
}
for (i=0;i<g->n;i++)
for(j=0;j<g->n;j++)
g->arcs[i][j]=0;//边数组置0
printf("输入边的信息!(注意结点是从0开始的)\n");
for (k=0;k<g->e;k++)
{
scanf("%d%d",&i,&j); //输入边的两个顶点,建立的是有向图!
g->arcs[i][j]=1;
}
}
int stack[30]; //用来存放路径的结点!
int count=0; //计数路径!
void find(graph * g,int i,int d,int l,int p)//i是新取出的结点,d是第几次调用!初始值置1
{
int j;
int t=d; //用来存放递增归的次数,以放便进行输出操作!
bool visited;
stack[t]=i;
if(i==p) //当新结点等于终点时,进行输出!
{
count++;
printf("路径 %d",count);
printf(" :");
for (int m=0;m<=t;m++)
printf("%d ",stack[m]);
printf("\n");
return;
}
for (j=0;j<g->n;j++)
{
visited=true;
for (int k=0;k<=t;k++)//当新取结点在已有结点集里,舍去!
if (j==stack[k])
{
visited=false;
break;
}
if(visited==true&&g->arcs[i][j]!=0)//当所取结点不在已有结点集,且结点与上个结点有路径时,进行下一层递归!
{
find(g,j,d+1,l,p);
}
}
}
void Allway(graph *g,int l,int p)
{
int i;
for (i=0;i<g->n;i++) //当结点不等于开始结点时,进行递归!
if(i!=l&&g->arcs[l][i]!=0)
{
stack[0]=l;
find(g,i,1,l,p);
}
}
void main()
{
int v1,v2;
printf("先建立图!\n");
struct graph * G;
G=(graph *)malloc(sizeof(graph));
creatgraph(G);
printf("建立成功!\n");
printf("输入开始结点和终止结点!\n");
scanf("%d%d",&v1,&v2);
Allway(G,v1,v2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -