poj 2570 Fiber Network floyd 传递闭包与二进制压缩
2018-01-31 10:07
148 查看
题意就是每个段光缆被一些公司掌握,询问所给定的一段上的光缆所有可以掌握它的公司,如果有字典序输出,没有的话输出‘-’。
思路:
看完题意不难想到就是个传递闭包将所有点对路径上的公共字符找出来,如果是处理字符串有点麻烦,就引出了一种新的方法和思想,二进制压缩。就是将有限字符集映射到一段二进制数上,这个忽然想起了真值函数的思想,二者本质相同,都是将难以处理的集合元素根据性质映射到01序列上。
思路:
看完题意不难想到就是个传递闭包将所有点对路径上的公共字符找出来,如果是处理字符串有点麻烦,就引出了一种新的方法和思想,二进制压缩。就是将有限字符集映射到一段二进制数上,这个忽然想起了真值函数的思想,二者本质相同,都是将难以处理的集合元素根据性质映射到01序列上。
#include<cstdio> #include<iostream> #include<string> #include<cstring> using namespace std; const int MAXN = 200 + 10; int n; int _map[MAXN][MAXN]; void floyd() { for(int k = 1; k <= n; ++k) { for(int i = 1; i <= n;++i) { for(int j = 1; j <= n; ++j) { _map[i][j] |= _map[i][k] & _map[k][j]; } } } } int main() { ios::sync_with_stdio(false); while(cin >> n) { int u,v; string s; memset(_map,0,sizeof(_map)); while(cin >> u >> v && u && v) { cin >> s; for(int i = 0;i <= s.size() - 1; ++i) _map[u][v] |= 1 << (s[i] - 'a'); } floyd(); int a,b; while(cin >> a >> b && a && b) { if(!_map[a][b]) { cout << '-' << endl; } else { for(int i = 0; i <= 25; ++i) { if(_map[a][b] & (1 << i)) { char temp = i + 'a'; cout << temp; } } cout << endl; } } cout << endl; } }
相关文章推荐
- POJ 2570 Fiber Network(Floyd传递闭包+状态压缩)
- poj--3279(二进制压缩枚举)
- POJ 2570 Fiber Network(最短路 二进制处理)
- POJ 2570 Fiber Network(最短路 二进制处理)
- POJ ---- 1222 和 POJ --- 3279 【二进制思维+状态压缩】
- poj3254-二进制状态压缩
- POJ 1014 Dividing 多重背包,二进制压缩成一般01背包问题
- POJ-2570 Fiber Network 状态压缩+floyd
- poj 2570 floyd 二进制+位运算
- POJ 2570 floyd 二进制
- POJ 2570 floyd(传递闭包+状态压缩)
- poj 2923 Relocation 二进制状态压缩 深搜+广搜
- POJ2570 二进制,位运算,Floyd
- POJ 2411 Mondriaan's Dream [经典状态压缩dp]
- POJ 3311 Hie with the Pie 状态压缩DP+floyd
- 状态压缩DP总结【POJ3254】【POJ1185】【POJ3311】【HDU3001】【POJ2288】【ZOJ4257】【POJ2411】【HDU3681】
- POJ 3279 二进制搜索
- HDU 2844+POJ 1014 +FZU 1432详解(多重背包&&二进制优化)
- POJ 3311 Hie with the Pie (BFS+最短路+状态压缩)
- poj 2411 Mondriaan's Dream(状态压缩DP)