UVa-208 Firetruck (图的DFS)
2024-09-01 04:31:37
UVA-208
天道好轮回。UVA饶过谁。
就是一个图的DFS。
不过这个图的边太多,要事先判一下起点和终点是否联通(我喜欢用并查集),否则会TLE。
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#define maxn 40
using namespace std; int a[maxn][maxn], vis[maxn], ans, f[maxn];
vector<int> q; int build(int x, int y)
{
a[x][y] = ;
a[y][x] = ;
} int found(int x)
{
if (f[x] == x) return x;
f[x] = found(f[x]);
return f[x]; } int add(int x, int y)
{
int fx = found(x), fy = found(y);
if (fx != fy) f[fx] = fy;
} void DFS(int k, int n)
{
if (k == n)
{
for (int i = ; i < q.size()-; i++)
cout << q[i] << " ";
cout << q[q.size()-] << endl;
ans++;
} for (int i = ; i <= maxn / ; i++)
if (!vis[i] && a[k][i])
{
vis[i] = ;
q.push_back(i);
DFS(i, n);
q.pop_back();
vis[i] = ;
}
} int main()
{
int n, cases = ;
while (cin >> n)
{
memset(a, , sizeof(a));
memset(vis, , sizeof(vis));
for (int i = ; i <= maxn/; i++) f[i] = i;
ans = ;
while (!q.empty()) q.pop_back();
int x, y;
while (cin >> x >> y && x && y)
{
build(x, y);
add(x, y);
}
++cases;
printf("CASE %d:\n", cases);
q.push_back();
vis[] = ;
if (found() == found(n)) DFS(, n);
printf("There are %d routes from the firestation to streetcorner %d.\n", ans, n);
} }
#
最新文章
- Ubuntu14.04或16.04下Hadoop及Spark的开发配置
- gitlab多人协作开发
- SQLMAP源码分析-目录结构
- ORM框架是什么
- opencv学习笔记(六)直方图比较图片相似度
- js时间冒泡,阻止事件冒泡
- MySQL与mabits大小比较、日期比较示例
- linux 多个源文件在编译时会产生一个目标文件
- Docker - 用Flannel跨主机
- 新概念英语(1-125)Tea for two
- Android 开发 图片网络缓存加载框架Fresco
- gradle下载的依赖包位置 及 修改
- Linux 搭建 Jenkins
- 使用css方法使footer保持在页面的最底部
- 嵌入AppBar并且带搜索建议的搜索框(Android)
- BZOJ.5312.冒险(线段树)
- Vmaware复制后的虚拟机不能上网问题解决
- java File linux windows 下 绝对路径 相对路径问题
- Java使用String类格式化当前日期
- Azkaban时区问题导致调度差1天