poj3921.Destroying the bus stations( 迭代加深搜索 && BFS )
2015-11-05 09:54
411 查看
有一张 n 个点, m 条边的有向图,要你删除最少的点使得 1 -> n 的路径长度大于 k ,两点之间路径长均为 1 ,1 号点和 n 号点不能被删除。
因为数据规模比较小,直接搜索(迭代加深),枚举删除的点数同时也作为深度,先 BFS 找到一条从 1 到 n 的路径,然后依次删除上面的点,分别进行 BFS 再次寻找路径,看能否大于k。
因为数据规模比较小,直接搜索(迭代加深),枚举删除的点数同时也作为深度,先 BFS 找到一条从 1 到 n 的路径,然后依次删除上面的点,分别进行 BFS 再次寻找路径,看能否大于k。
#include <cstdio> #include <cstring> using namespace std; const int MAX_N = 100; const int MAX_M = 4005; struct node{ int v, next; }E[MAX_M]; int head[MAX_N], top = 0; inline void add(int u, int v) { E[++ top].v = v; E[top].next = head[u]; head[u] = top; } int n, m, k, id, to[MAX_N], q[MAX_N], arr[MAX_N][MAX_N]; bool got = 0, vis[MAX_N]; void init() { for(int i = 1; i <= m; i ++){ int u, v; scanf("%d%d", &u, &v); add(u, v); } } void bfs() { memset(to, 0, sizeof(to)); int begin = 0, end = 1; q[begin] = 1; while(begin < end){ int x = q[begin]; for(int i = head[x]; i; i = E[i].next) if(!vis[E[i].v] && to[E[i].v] == 0){ to[E[i].v] = x; q[end] = E[i].v; end ++; if(E[i].v == n) break; } begin ++; if(to ) break; } } void dfs(int deep) { if(got) return; bfs(); if(to == 0){ got = 1; return; } int v = n, tot = -1; while(v){ arr[deep][++ tot] = v; v = to[v]; } if(tot > k){ got = 1; return; } if(deep > id) return; for(int i = 1; i < tot; i ++){ vis[arr[deep][i]] = 1; dfs(deep + 1); vis[arr[deep][i]] = 0; } } void doit() { int ans = -1; got = 0; for(int i = 0; i <= n; i ++){ id = i; memset(vis, 0, sizeof(vis)); dfs(1); if(got) { ans = i; break; } } if(ans != -1)printf("%d\n", ans); else printf("%d\n", n); } int main() { freopen("1.in", "r", stdin); while(scanf("%d%d%d", &n, &m, &k) != EOF){ if(n == 0 && m == 0 && k == 0) break; memset(head, 0, sizeof(head)); top = 0; init(); doit(); } return 0; }
相关文章推荐
- Android开发TextView实现长按复制文本功能的方法
- iOS9 HTTP 不能正常使用的解决办法
- Codeforces Round #329 (Div. 2) B. Anton and Lines 逆序对
- 如何学习挖掘漏洞[参考多方面资料]
- Extjs gridPanel对选中行的操作
- SpringMVC返回json数据的三种方式
- git 常用指令
- boost读写锁实现
- 机器学习资料大汇总
- js cookie
- mysql截取字符串
- Android中 Bitmap和Drawable相互转换的方法
- Windows下文件名或目录的简写方法
- 一个libvirt/qemu创建虚拟机错误的解决办法
- poj 1147 Binary codes bwt压缩算法
- 模板_线段树
- 大鹏带你深层理解数据库习题
- Installshield判断系统版本
- android源码学习之源码编译并nexus s真机刷机
- UITextField,UITextView ,UILabel,键盘,UIFont