UVA208 Firetruck 题解
题目链接:UVA208 Firetruck
题意:
输入一个 $n(n \le 20)$ 个结点的无向图以及某个结点 $k$,按照字典序从小到大顺序输出从结点 $1$ 到结点 $k$ 的所有简单路径
怎么随机到这么水的题的啊(
这个题直接 dfs 暴搜就好了。唯一需要注意的是,这道题很无聊的卡了下无解的情况,所以要 bfs 先判一下
时间复杂度 $\mathcal{O}(\text{ok})$
代码:(题解区随便扒的)
#include <bits/stdc++.h>
using namespace std;
constexpr int MAX_N = 25;
int target, cnt;
int path[MAX_N];
bool vis[MAX_N];
bool G[MAX_N][MAX_N];
bool BFS()
{
	queue<int> q;
	q.push(1), vis[1] = true;
	while (!q.empty())
	{
		int cur = q.front();
		q.pop();
		if (cur == target) { return true; }
		for (int i = 0; i < MAX_N; ++i)
		{
			if (G[cur][i] && !vis[i])
			{
				vis[i] = true;
				q.push(i);
			}
		}
	}
	return false;
}
void DFS(int step, int node)
{
	if (node == target)
	{
		cnt++;
		printf("1");
		for (int i = 1; i < step; i++) { printf(" %d", path[i]); }
		putchar('\n');
		return;
	}
	for (int i = 0; i < MAX_N; ++i)
	{
		if (G[node][i] && !vis[i])
		{
			vis[i] = true;
			path[step] = i;
			DFS(step + 1, i);
			vis[i] = false;
			path[step] = 0;
		}
	}
}
int main()
{
	int kase = 1;
	while (scanf("%d", &target) == 1 && target)
	{
		int from, to;
		bool flag = true;
		cnt = 0;
		memset(path, 0, sizeof(path));
		memset(vis, false, sizeof(vis));
		memset(G, false, sizeof(G));
		while (scanf("%d%d", &from, &to) == 2 && from && to)
		{
			G[from][to] = G[to][from] = true;
		}
		printf("CASE %d:\n", kase++);
		if (BFS())
		{
			memset(vis, 0, sizeof(vis));
			path[0] = 1, vis[1] = true;
			DFS(1, 1);
		}
		printf("There are %d routes from the firestation to streetcorner %d.\n", cnt, target);
	}
	return 0;
}