邻接矩阵存储简单路径
5000(ms)
10000(kb)
2197 / 4175
Tags: 邻接矩阵
假设无向图G采用邻接矩阵存储,设计一个算法,输出图G中从顶点u到v的所有简单路径。
输入
简单路径是指路径上的顶点不重复。第一行为一个整数n,表示顶点的个数(顶点编号为0到n-1),第二行表示顶点u和v的编号,接下来是为一个n*n大小的矩阵,表示图的邻接关系。数字为0表示不邻接,1表示不邻接。
输出
输出图G中从顶点u到v的所有简单路径。
样例输入
5
0 3
0 1 0 1 1
1 0 1 1 0
0 1 0 1 1
1 1 1 0 1
1 0 1 1 0
样例输出
0123
01243
013
03
04213
0423
043
#include<stdio.h>
int map[100][100];
int a,b;
int n;
void CreateMap()
{
for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&map[i][j]);
}
void FindAllPath(int path[],int k,int i,int flag[])
{
if(flag[i]==0)//如果该点未标记,则将其标记,并且储存在路径中
{
flag[i]=1;
path[k++]=i;
if(i==b)//如果该点为结束点,则输出路径
{
for(int j=0;j<k;j++)
{
printf("%d",path[j]);
}
printf("\n");
}
for(int j=0;j<n;j++)//遍历该点对应的行
{
if(map[i][j]!=0)
{
FindAllPath(path,k,j,flag);
for(int t=k;t<n;t++)//还原标记,因为上一次的遍历中走过了一些点,将这些点的标记变成了1,继续向该行的下一个点递归,就得将该行上个点递归改变的标记还原
{
if(path[t]!=-1)
{
flag[path[t]]=0;
path[t]=-1;
}
}
}
}
}
}
int main()
{
scanf("%d",&n);
scanf("%d %d",&a,&b);
CreateMap();
int path[100],k=0,flag[100]={0};//path储存路径,flag初始化标记 ,k记录路径长度
for(int i=0;i<n;i++) path[i]=-1;//初始化路径
path[k++]=a;//将 开始点储存在路径的第一个位置
flag[a]=1;//将开始点标记
for(int i=0;i<n;i++)//遍历开始点对应的行
{
if(map[a][i]!=0)
{
FindAllPath(path,k,i,flag);
for(int t=k;t<n;t++)//还原标记,因为上一次的遍历中走过了一些点,将这些点的标记变成了1,继续向该行的下一个点递归,就得将该行上个点递归改变的标记还原
{
if(path[t]!=-1)
{
flag[path[t]]=0;
path[t]=-1;
}
}
}
}
}