uva 12726 One Friend at a Time bfs + 状态压缩
2014-10-02 02:41
337 查看
题意:
给定n, m, k (n <= 20, k <= n),表示有n个人,m个关系(关系为a和b是否认识), 编号为1-n, 1号想认识n号,可是,两个人如果想建立关系必须满足,他们的共同朋友大于或等于k, 求1想认识n,1最少需要认识几个人。
题解:
给每个人与其他人的关系进行状态压缩,然后直接bfs搜索即可。
代码:
给定n, m, k (n <= 20, k <= n),表示有n个人,m个关系(关系为a和b是否认识), 编号为1-n, 1号想认识n号,可是,两个人如果想建立关系必须满足,他们的共同朋友大于或等于k, 求1想认识n,1最少需要认识几个人。
题解:
给每个人与其他人的关系进行状态压缩,然后直接bfs搜索即可。
代码:
#include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; const int maxn = 20 + 5; int n, m, k, rel[maxn], vis[1<<21]; struct Way{ int v, step; Way(int v = 0, int step = 0) : v(v), step(step) {} }str, now, nxt; void read_input() { scanf("%d%d%d", &n, &m, &k); for (int i = 0; i < m; i++) { int x, y; scanf("%d%d", &x, &y); x--; y--; rel[x] |= (1 << y); rel[y] |= (1 << x); } str = Way(rel[0], 0); } void init() { memset(rel, 0, sizeof(rel)); memset(vis, 0, sizeof(vis)); } bool ok(int status) { int cnt = 0; for (int i = 0; i < n; i++) { if (status & (1<<i)) { cnt ++; } } if (cnt >= k) return true; return false; } int bfs() { if (str.v & (1<<(n-1))) { return 0; } queue<Way> Q; Q.push(str); vis[str.v] = 1; while (!Q.empty()) { now = Q.front(); Q.pop(); if (ok(now.v & rel[n-1])) { return now.step; } for (int i = 0; i < n; i++) { if (now.v & (1 << i)) continue; nxt = now; nxt.step++; if (ok(now.v & rel[i])) { nxt.v |= (1<<i); if (!vis[nxt.v]) { Q.push(nxt); vis[nxt.v] = 1; } } } } return -1; } int main() { // freopen("/Users/apple/Desktop/in.txt", "r", stdin); int t, kase = 0; scanf("%d", &t); while (t--) { init(); read_input(); printf("Case #%d: %d\n", ++kase, bfs()); } return 0; }
相关文章推荐
- UVa 12569 - Planning mobile robot on Tree (EASY Version)(BFS+状态压缩)
- UVA 1533 - Moving Pegs 状态压缩 + bfs
- UVa 816 Abbott's Revenge(状态压缩BFS)
- UVa12726 one Friend at a Time (位 广搜)
- UVA--12569(状态压缩+bfs)
- UVA Planning mobile robot on Tree树上的机器人(状态压缩+bfs)
- POJ 1753 Flip Game (黑白棋) (状态压缩+BFS)
- uva 1099 状态压缩(dp专组E)
- uva11008 状态压缩~最优值
- uva 10817(状态压缩)
- CSU1855:Shut the Box(二进制状态压缩+BFS)
- HDU 1429 bfs 状态压缩
- uva 1047 - Zones-World finals 2005 状态压缩枚举
- uva 11825 Hackers' Crackdown(状态压缩DP)
- UVA 658 状态压缩+隐式图+优先队列dijstla
- poj 1753 状态压缩+bfs
- UVa 11795 Mega Man's Mission(动态规划-状态压缩DP)
- 效率提升最重要的原则 - Doing one thing at a time
- UVA -12569 (BFS+状态压缩)
- hdu5025 Saving Tang Monk bfs+状态压缩