uva208
2016-05-12 19:42
197 查看
题意:
从1出发,到达给的点有几种走法
所有的走法显然是需要回朔来求的,为避免超时,我们要剪枝
那么最重要的就是用到的flo,这个方法可以判断通路(即当前点i是否可达终点),如果不可达就剪枝
那么没达到终点,我们就把路径输出,路径存于一个数组中
代码:
从1出发,到达给的点有几种走法
所有的走法显然是需要回朔来求的,为避免超时,我们要剪枝
那么最重要的就是用到的flo,这个方法可以判断通路(即当前点i是否可达终点),如果不可达就剪枝
那么没达到终点,我们就把路径输出,路径存于一个数组中
代码:
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int mmax = 0x3f3f3f3f; int n, v; int g[30][30]; int vis[30]; int sum; int flo[30][30]; int rec[30]; void dfs(int cur ,int s) { if(cur == n) { printf("1"); for(int i=1; i<s-1; i++) printf(" %d", rec[i]); printf(" %d\n", n); sum++; return; } for(int i=1; i<=v; i++) { if(flo [i]!=mmax && !vis[i] &&g[cur][i]==1) { rec[s] = i; vis[i] = 1; dfs(i, s+1); vis[i] = 0; } } } int main() { int cas = 1; while(scanf("%d", &n) != EOF) { v = 0; int a, b; for(int i=0; i<=21; i++) for(int j=0; j<=21; j++) g[i][j] = flo[i][j] = mmax; while(scanf("%d%d", &a, &b) && (a||b)) { g[a][b] = g[b][a] = 1; flo[a][b] = flo[b][a] = 1; v = max(max(a, b) ,v); } for(int k=1; k<=v; k++) for(int i=1; i<=v; i++) for(int j=1; j<=v; j++) if(flo[i][j] > flo[i][k]+flo[k][j]) { flo[i][j] = flo[i][k]+flo[k][j]; } vis[1] = 1; sum = 0; printf("CASE %d:\n", cas++); dfs(1, 1); printf("There are %d routes from the firestation to streetcorner %d.\n", sum, n); } return 0; }
相关文章推荐
- [线段树合并]
- kafka环境
- 【操作系统】实验三 进程调度模拟程序 截止提交时间:2016.5.12
- 合并两个有序的链表
- fastImageCache解析:来自bang同学,非常棒!
- fastImageCache解析:来自bang同学,非常棒!
- 打印包含7的三位数
- 是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
- 乱码问题的整理 ps:补交昨天的作业
- 关于要求一串数字不超过某个数字可以达到的最大和(DP背包问题)
- kafka入门
- 后缀数组---Musical Theme
- lintcode:背包问题
- android获取屏幕的宽高
- Partition-方案一. 通过 Export/import 方法
- 直接插入排序
- 学习OpenCV——Surf(特征点篇)&flann快速最近邻搜索算法
- 设计模式中的七个原则
- hdu-2489 Minimal Ratio Tree(DFS+最小生成树)
- html初探