POJ2570 二进制,位运算,Floyd
来源:互联网 发布:菜鸟7步学会数据分析 编辑:程序博客网 时间:2024/06/07 19:01
题意:
给你一个有向图,两点之间有多种连接方式,然后每次询问都问你点A,B之间有哪些方式可以到达,每个小字母是一个方式.
思路:
给你一个有向图,两点之间有多种连接方式,然后每次询问都问你点A,B之间有哪些方式可以到达,每个小字母是一个方式.
思路:
很巧妙的位运算和Floyd应用,借助Floyd的更新过程,去更新任意两组边组合起来的长边,如 map[i][j] 是由 map[i][k] 和 map[k]][j]接起来的,更新方式很容易理解,是map[i][j] = map[i][j] | (map[i][k] & map[k][j]),每条边的状态都转化成2进制就行了。
#include<stdio.h>#include<string.h>int map[205][205];int Pow(int n){ int p = 1; for(int i = 1 ;i <= n ;i ++) p *= 2; return p;}int main (){ int n; int a ,b ,l ,i ,j ,k; char str[100]; while(~scanf("%d" ,&n) && n) { memset(map ,0 ,sizeof(map)); while(scanf("%d %d" ,&a ,&b) && a + b) { scanf("%s" ,str); l = strlen(str); for(i = 0 ;i < l ;i ++) map[a][b] += Pow(str[i] - 'a'); } for(k = 1 ;k <= n ;k ++) for(i = 1 ;i <= n ;i ++) for(j = 1 ;j <= n ;j ++) map[i][j] = map[i][j] | (map[i][k] & map[k][j]); while(scanf("%d %d" ,&a ,&b) && a + b) { int mk = 0; for(i = 0 ;i < 26 ;i ++) { if(map[a][b] & Pow(i)) { printf("%c" ,'a' + i); mk = 1; } } if(!mk) printf("-"); printf("\n"); } printf("\n"); } return 0;}
0 0
- POJ2570 二进制,位运算,Floyd
- poj2570 Floyd
- poj 2570 floyd 二进制+位运算
- 传递闭包+二进制位运算+floyd(poj2570)
- poj2570||zoj1967 floyd思想
- poj2263&poj2570 floyd变形
- poj2570 zoj1967 Fiber Network floyd
- 二进制与位运算
- 23-二进制,位运算
- 二进制和位运算
- 二进制中的位运算
- 二进制的位运算
- 二进制的位运算
- 二进制 位运算
- 二进制的位运算
- 二进制的位运算
- 二进制,位运算,移位运算
- POJ2570 Fiber Network floyd传递闭包
- python 中文乱码问题深入分析
- 黑马程序员-银行调度系统(2)
- TQ2440 软中断的基本使用
- Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL)异常解决方法
- JSF2.0实战
- POJ2570 二进制,位运算,Floyd
- 黑马程序员-枚举、反射、泛型(2)
- 应用社会化媒体进行营销的7个关键步骤
- Activity的生命周期
- android中activity全屏的方法
- 关于第三方控件Infragistics的安装
- awk学习总结(二) How awk works and awk CMD in a file
- Android反射机制实现与原理
- QC的UseBPTWrapperTest 功能与Win内核版本