https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=144

题意:给出一个n个结点的无向图以及某个结点k,按照字典序从小到大顺序输出从1到结点k的所有路径。

思路:如果直接矩阵深搜的话是会超时的,所以我们可以从终点出发,将与终点相连的连通块保存起来,这样dfs深搜时可以剪枝掉一些到达不了的点。只要解决了这个,dfs就是小问题。

这道题还有点坑的就是输出格式和它所给的格式不一样,注意一下。

 #include<iostream>
#include<cstring>
using namespace std; const int maxn = ; int n, step, route;
int map[maxn][maxn];
int path[maxn];
int vis[maxn];
int trunk[maxn]; void init(int cur) //从终点开始遍历,保存与终点相连的连通块
{
trunk[cur] = ;
for (int i = ; i < maxn; i++)
{
if (map[cur][i] && !trunk[i])
init(i);
}
} void dfs(int cur, int step)
{
if (cur == n)
{
cout << "";
for (int i = ; i < step; i++)
cout << " " << path[i];
cout << endl;
memset(path, , sizeof());
route++;
}
for (int i = ; i < maxn; i++)
{
if (map[cur][i] && !vis[i] && trunk[i])
{
vis[i] = ;
path[step] = i;
dfs(i, step + );
vis[i] = ;
}
}
return;
} int main()
{
//freopen("D:\\txt.txt", "r", stdin);
int a, b, kase = ;
while (cin >> n && n)
{
memset(vis, , sizeof(vis));
memset(map, , sizeof(map));
memset(path, , sizeof(path));
memset(trunk, , sizeof(trunk));
while (cin >> a >> b)
{
if (!a && !b) break;
map[a][b] = map[b][a] = ;
}
vis[] = ;
step = ;
route = ; //记录路径数量
init(n); //计算保存连通块
cout << "CASE " << ++kase << ":" << endl;
dfs(, );
cout << "There are " << route << " routes from the firestation to streetcorner " << n << "." << endl; }
return ;
}

UVa 208 消防车(dfs+剪枝)的更多相关文章

  1. Sticks(UVA - 307)【DFS+剪枝】

    Sticks(UVA - 307) 题目链接 算法 DFS+剪枝 1.这道题题意就是说原本有一些等长的木棍,后来把它们切割,切割成一个个最长为50单位长度的小木棍,现在想让你把它们组合成一个个等长的大 ...

  2. UVa 208 - Firetruck 回溯+剪枝 数据

    题意:构造出一张图,给出一个点,字典序输出所有从1到该点的路径. 裸搜会超时的题目,其实题目的数据特地设计得让图稠密但起点和终点却不相连,所以直接搜索过去会超时. 只要判断下起点和终点能不能相连就行了 ...

  3. *HDU1455 DFS剪枝

    Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  4. POJ 3009 DFS+剪枝

    POJ3009 DFS+剪枝 原题: Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16280 Acce ...

  5. poj 1724:ROADS(DFS + 剪枝)

    ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10777   Accepted: 3961 Descriptio ...

  6. DFS(剪枝) POJ 1011 Sticks

    题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...

  7. DFS+剪枝 HDOJ 5323 Solve this interesting problem

    题目传送门 /* 题意:告诉一个区间[L,R],问根节点的n是多少 DFS+剪枝:父亲节点有四种情况:[l, r + len],[l, r + len - 1],[l - len, r],[l - l ...

  8. HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)

    Counting Cliques Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  9. HDU 5937 Equation 【DFS+剪枝】 (2016年中国大学生程序设计竞赛(杭州))

    Equation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

随机推荐

  1. github多人协同使用。

    点击 一:自己跟随别人的项目进行开发 1:首先登陆github,找到自己协同开发的项目. 例如:CrossMountain 的we-pay项目 ,点击  fork,该项目就在自己的账号下面了. 2:在 ...

  2. logstash的各个场景应用(配置文件均已实践过)

    场景: 1) datasource->logstash->elasticsearch->kibana 2) datasource->filebeat->logstash- ...

  3. 深入理解Fabric环境搭建的详细过程(转)

    前面的准备工作我就不用多说了,也就是各种软件和开发环境的安装,安装好以后,我们git clone下来最新的代码,并切换到v1.0.0,并且下载好我们需要使用的docker镜像,也就是到步骤6,接下来我 ...

  4. R实现的最小二乘lsfit函数学习

    1.源码 function (x, y, wt = NULL, intercept = TRUE, tolerance = 1e-, yname = NULL) { x <- as.matrix ...

  5. Ubuntu16.04 安装 “宋体,微软雅黑,Consolas雅黑混合版编程字体” 等 Windows 7 下的字体

    Windows平台下,“宋体”.“微软雅黑”.“Courier New(编程字体)”用的比较多,看的也习惯了.那如何在 Ubuntu下也安装这些字体呢? 操作步骤如下: 第一步:从 Windows 7 ...

  6. VS2013密钥(所有版本)

    Visual Studio Ultimate 2013 KEY(密钥):BWG7X-J98B3-W34RT-33B3R-JVYW9 Visual Studio Premium 2013 KEY(密钥) ...

  7. pycharm Unresolved reference 无法引入包

    1. 问题描述: 在项目中P存在文件夹A.B.C,A有文件夹a和b,在a中引入b的一个类, a.py: from b import func1 虽然运行成功,但是在Pycharm中显示: Unreso ...

  8. Mybatis—三剑客之generator使用方法

    三剑客之generator主要用于自动生成POJO实体类   准备素材: mybatis-generator-core-1.3.2.jar     mysql-connector-java-5.1.2 ...

  9. mongodbtemplate配置

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  10. Python:slice与indices

    slice: eg: >>>e=[0,1,2,3,4,5,6] >>>s=slice(2,3) >>>e[s] [2] slice的区间左闭右开[ ...