UVA208在一个图中,给定终点和起点,搜索路线,巧妙剪枝
2015-10-04 00:20
405 查看
这题貌似后台数据都是比较密的图,所以暴搜的话必定会T,这时就要加强剪枝,想了一会,也试了几发,没有找到正确的
剪枝姿势,一直T,后来看别人的,是开了数组预处理下,从终点开始求连通块,因为必须和终点在一个连通块才能到达,
然后就可以搜了,这个剪枝刚开始其实有想到,但是想错了,我想的是正反同时搜索,然而并不能实现,能想到用连通块去预处理
也是挺巧妙的,另外这题还有一个坑点,题中并没有说要按字典序输出,然而后台数据貌似没有spj,所以这题起初我用邻接表存储
图就WA了,然后改成了邻接矩阵就过了。
剪枝姿势,一直T,后来看别人的,是开了数组预处理下,从终点开始求连通块,因为必须和终点在一个连通块才能到达,
然后就可以搜了,这个剪枝刚开始其实有想到,但是想错了,我想的是正反同时搜索,然而并不能实现,能想到用连通块去预处理
也是挺巧妙的,另外这题还有一个坑点,题中并没有说要按字典序输出,然而后台数据貌似没有spj,所以这题起初我用邻接表存储
图就WA了,然后改成了邻接矩阵就过了。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <set> #include<cmath> #include<climits> #include<vector> #include<cfloat> using namespace std; const int P = 1e9 + 7; const int N=2000; int n; int maps[110][110]; bool vis[110]; int A[30]; int vis2[110]; int ans; void init(int cur) { vis2[cur]=1; for(int i=0;i<22;i++) { if(maps[cur][i]&&!vis2[i]) init(i); } } void dfs(int u,int cur) { if(u==n) { for(int i=0;i<cur-1;i++) cout<<A[i]<<' '; cout<<u<<endl; ans++; return; } else { for(int i=0;i<22;i++) { if(maps[u][i]&&!vis[i]&&vis2[i]) { vis[i]=1; A[cur]=i; dfs(i,cur+1); vis[i]=0; } } } } int main() { int cas=0; while(cin>>n) { int a,b; memset(maps,0,sizeof(maps)); while(scanf("%d%d",&a,&b)&&a+b) { maps[a][b]=1; maps[b][a]=1; } cout<<"CASE "<<++cas<<':'<<endl; memset(vis,0,sizeof(vis)); memset(vis2,0,sizeof(vis2)); ans=0; vis[1]=1; A[0]=1; init(n); dfs(1,1); printf("There are %d routes from the firestation to streetcorner %d.\n",ans,n); } return 0; }
相关文章推荐
- Mount VDI as logical drive on host
- MySql 使用递归函数时遇到的级联删除问题
- lua脚本的基本语法(二)
- torcs源码分析--(3)总览
- php 基于PDO下的exec()函数查询
- HDU 5495 LCS (置换)
- torcs源码分析--(2)关键文件及结构
- 航电 acm 2013
- torcs源码分析--(1)工程分析
- OpenGL 缺省视景体是中心在原点,边长为2的立方体
- 用CocoaPods做iOS程序的依赖管理
- 知名广告拦截插件 Adblock 出售 买家未公布
- Myeclipse提示失效?
- final关键字
- 《TCP/IP详解 卷一:协议》读书笔记--ARP:地址解析协议
- static关键字
- Android中Activity四种启动模式(LaunchMode)和taskAffinity属性
- 无名
- GOF23设计模式之 命令模式command
- LoadRunner测试下载功能点脚本(方法一)