uva208 -Firetruck (双向搜索进行剪枝)
2016-02-26 15:23
369 查看
题意:
给你一个图,1为起始节点,END为终止节点,让你打印起始到终点的所有路径。
思路:
深搜+回溯,超时了,看到一种解释是这样的,不是所有的路都能到达终点,比如从南京到北京,地图上各种路,东西南北乱走一通是不行的。
解决方法即剪枝,从终点搜索确定出可到达终点的路线。
代码如下:
给你一个图,1为起始节点,END为终止节点,让你打印起始到终点的所有路径。
思路:
深搜+回溯,超时了,看到一种解释是这样的,不是所有的路都能到达终点,比如从南京到北京,地图上各种路,东西南北乱走一通是不行的。
解决方法即剪枝,从终点搜索确定出可到达终点的路线。
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 25; int ege ,route ,vis ,a ; int END, n, routeCnt, len; void dfs(int cur) { if (cur == END) { printf("1"); for (int i = 0; i < len; i++) { printf(" %d", route[i]); } printf("\n"); routeCnt++; return; } for (int i = 1; i <= n; i++) { if (ege[cur][i] && !vis[i]&&a[END][i]) { route[len++] = i; vis[cur] = 1; dfs(i); vis[cur] = 0; len--; } } } int main() { int cas = 0; while (~scanf("%d", &END)) { int u, v; n = 0; routeCnt = 0; len = 0; memset(ege, 0, sizeof(ege)); memset(vis, 0, sizeof(vis)); memset(route, 0, sizeof(route)); memset(a,0,sizeof(a)); while (scanf("%d%d", &u, &v) && (u&&v)) { ege[u][v] = ege[v][u] = 1; a[u][v] = a[v][u] = 1; n = max(n, max(u, v)); } printf("CASE %d:\n", ++cas); for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) for (int k = 1; k <= n; k++) if (a[i][j] && a[j][k]) a[i][k] = a[k][i] = 1; dfs(1); printf("There are %d routes from the firestation to streetcorner %d.\n", routeCnt,END); } return 0; }
相关文章推荐
- Android中日期时间格式转换
- make: ./libtool:command not found
- JS时间格式化
- activemq启动不起来,报错Address already in use: JVM_Bind
- angularJs 指令的用法
- Sublime3和Chrome配置自动刷新网页【实测可用】
- iOS实现简单的抽屉效果
- Android开发中遇到的一些小问题
- cocos2dx 重载node绘制基本图形
- Could not find the main class: org.elasticsearch.bootstrap.Elasticsearch. Program will exit.
- Oracle 11g 修改中文字符集
- qt线程,线程池用到的一点问题
- android设置activity全屏 | 无标题
- VMare虚拟机突破锐捷多网卡限制,成功联网
- ADT启动失败情况列举
- 文本挖掘--将分词之后的文档转化为结构化的数据
- PO & POJO & BO & DTO & VO的区别
- python XPath
- javascript 立即执行函数的写法
- windows+apache+php+mysql快速搭建服务器环境