无向图深搜输出两点间所有路径

/*
深度优先搜索遍历;
对于当前点,首先设置标记(代表该点已在路径中),然后压入路径;
若当前为终点,则打印路径;
遍历与当前点连接的未被标记的的点,直到无路可走;
当前点退出路径,清除标记。

自己没看出错误,希望大家如果看到,可以帮忙找找,嘻嘻。
对有向图应该也是适合的。
*/

void DFS(int now)
{
    set[now]=1;
	stack[++top]=now;
	if(now==n) PrintPath();
	for(int i=1;i<=n;++i)
		if(set[i]==0&&Map[now][i]<INF)
			DFS(i);
	top--;
	set[now]=0;
}
/*
试一个简单例子:
打印从1到n所有路径:
*/

#include<stdio.h>
#include<string.h>
#define INF 1e5

int n,m;
int set[105];
int Map[105][105];
int stack[105],top;

void InitInfo()
{
	for(int i=1;i<=n;++i)
	    for(int j=1;j<=n;++j)
	        Map[i][j]=INF;
	memset(set,0,sizeof(set));
	top=-1;
}

void CreateMap()
{
	int a,b,w;
	scanf("%d%d",&n,&m);
	InitInfo();
	for(int i=0;i<m;++i){
		scanf("%d%d%d",&a,&b,&w);
		Map[a][b]=Map[b][a]=w;
	}
}

void PrintPath()
{
	printf("%d",stack[0]);
	for(int i=1;i<=top;++i)
	    printf("->%d",stack[i]);
	printf("\n");
}

void DFS(int now)
{
    set[now]=1;
	stack[++top]=now;
	if(now==n) PrintPath();
	for(int i=1;i<=n;++i)
		if(set[i]==0&&Map[now][i]<INF)
			DFS(i);
	top--;
	set[now]=0;
}

int main()
{
	CreateMap();
	puts("Path:");
	DFS(1);
	return 0;
}
/*
6 9
1 2 3
2 3 2
3 1 30
3 4 20
4 5 30
3 5 6
1 5 8
5 6 1
1 6 26
*/

在这里插入图片描述

  • 6
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值