POJ-2570 Fiber Network 状态压缩+floyd
题意:给定一个网络,每条线路都同时有几个公式拥有,现在问某两点之间哪些公司通过自己拥有的路径单独联通。
分析:问题开起来是给定了多个图,对他们分别求一个连通性,但是这里把多个图压缩到一个int型数字内,因为这里只是简简单单求一个连通性,使用位运算非常高效。
代码如下:
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> using namespace std; int G[205][205]; int N; void floyd() { for (int k = 1; k <= N; ++k) { for (int i = 1; i <= N; ++i) { if (G[i][k] == 0 || i == k) continue; for (int j = 1; j <= N; ++j) { if (G[k][j] == 0 || j == k) continue; G[i][j] |= G[i][k] & G[k][j]; } } } } int main() { while (scanf("%d", &N), N) { int a, b; char s[50]; memset(G, 0, sizeof (G)); while(cin >> a >> b, a | b) { cin >> s; int len = strlen(s); for (int i = 0; i < len; ++i) { G[a][b] |= 1 << s[i]-'a'; } } floyd(); while (cin >> a >> b, a | b) { if (G[a][b] == 0) { putchar('-'); } else { for (int i = 0; i < 26; ++i) { if (G[a][b] & (1 << i)) { putchar('a'+i); } } } puts(""); } puts(""); } return 0; }