题意就是每个段光缆被一些公司掌握,询问所给定的一段上的光缆所有可以掌握它的公司,如果有字典序输出,没有的话输出‘-’。
思路:
看完题意不难想到就是个传递闭包将所有点对路径上的公共字符找出来,如果是处理字符串有点麻烦,就引出了一种新的方法和思想,二进制压缩。就是将有限字符集映射到一段二进制数上,这个忽然想起了真值函数的思想,二者本质相同,都是将难以处理的集合元素根据性质映射到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;
}
}