博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVa 208 - Firetruck <双向DFS>
阅读量:4556 次
发布时间:2019-06-08

本文共 1255 字,大约阅读时间需要 4 分钟。

这题后台数据一定很坑,估计是那种从节点1可以扩展到节点2~19,但是就是无法与节点20连通的那种,才导致了刚开始没有逆向搜索的时候TLE到3000MS。

逆向DFS找到所有与终点相连的节点保存下来,速度很快的。这样正向搜索时就要把与终点不相连的节点剪枝。

判断连通性的方法有很多,其实本题还可以用BFS或者并查集防止超时。

#include 
#include
#include
#include
#include
#include
using namespace std;int n, kase, cnt, vis[22], road[22][22];int join[22];vector
res;void find_join(int u){ join[u] = 1; for(int v = 1; v <= 20; ++v) if (!join[v] && road[u][v]) find_join(v);}void DFS(int u){ if (u == n){ ++cnt; for (unsigned i = 0; i != res.size(); ++i) printf("%d%c", res[i], i==res.size()-1 ? '\n' : ' '); return; } for (int v = 1; v <= 20; ++v){ if (!vis[v] && road[u][v] && join[v]){ vis[v] = 1; res.push_back(v); DFS(v); vis[v] = 0; res.pop_back(); } }}void init(){ cnt = 0; memset(road, 0, sizeof(road)); memset(vis, 0, sizeof(vis)); memset(join, 0, sizeof(join)); vis[1] = 1; res.clear(); res.push_back(1);}int main(){ while (init(), cin >> n){ int x, y; while (cin >> x >> y, x || y) road[x][y] = road[y][x] = 1; printf("CASE %d:\n", ++kase); find_join(n); DFS(1); printf("There are %d routes from the firestation to streetcorner %d.\n", cnt, n); } return 0;}

转载于:https://www.cnblogs.com/kunsoft/p/5312723.html

你可能感兴趣的文章
APUE读书笔记-第16章-网络IPC: 套接字
查看>>
更新整理本人所有博文中提供的代码与工具(C++,2013.08)
查看>>
babel更新之后的 一些坑
查看>>
Python基础-Alex
查看>>
FTP权限问题解析,553 Can't open that file: Permission denied
查看>>
string.Format和cookie代码
查看>>
DeepLearnToolbox
查看>>
linux 系统 Load average
查看>>
团体程序设计天梯赛(CCCC) L3013 非常弹的球 不同思路
查看>>
IPA文件的自动化生成和无线分发
查看>>
Django 1.11.7+django_pyodbc_azure-1.11.0.0+pyodbc 连接mssql 数据库
查看>>
Mybatis 查询传多个参数(3中方法)
查看>>
iOS 10对隐私权限的管理(必须要改否则会crash)
查看>>
org.slf4j.impl.SimpleLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext
查看>>
GJM : Socket TCP 通信连接(一)
查看>>
阿里云上部署kafka--遇到的坑
查看>>
【转】 Pro Android学习笔记(六一):Preferences(5):组织Preference
查看>>
NaN属性,isNaN函数
查看>>
Tomcat配置多线程和配置数据库连接池
查看>>
python解析oracle日志中的报错
查看>>