虽说是自己邪恶的,但是看了别人的思路,真是很巧妙的 位运算的应用,这道题目floyd只是个外壳,其实精华在于位运算,题目意思有点难理解 好好看,题意我也懒得写,复制了别人的 ,
题意:某条道路由一些公司修建,修建道路的公司可以提供这条路上的连通,询问哪些公司可以提供从A到B的路径.每个公司由一个小写字母表示。
思路:因为只有26个字母 所以可能用二进制去表示每个公司 1表示该路径上有该公司 比如说 1-->3 这条路径上有 abc这三个公司 则mat[1][3] 二进制表示为00..0111; 然后就是用floyd传递闭包。
#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>
#define ll long long
#define LL __int64
const ll INF=9999999999999;
using namespace std;
#define M 400000100
#define inf 0xfffffff
//vector<int,int> G[20002];
//vector<pair<int,int>> ::iterator iter;
//map<ll,int>mp;
//map<ll,int>::iterator p;
int mp[212][212];
void clear()
{
memset(mp,0,sizeof(mp));
}
int main(void)
{
int n;
bool flag=false;
while(scanf("%d",&n),n)
{
clear();
int u,v;
char s[26];
for(int i=0;;i++)
{
scanf("%d %d",&u,&v);
if(u+v == 0)
break;
scanf("%s",s);
for(int j=0;j<strlen(s);j++)
{
mp[u][v]|=1<<(s[j]-'a');
}
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
mp[i][j]=mp[i][j]|(mp[i][k]&mp[k][j]);
scanf("%d %d",&u,&v);
while(u!=0 && v!=0)
{
if(mp[u][v])
{
for(int i=0;i<26;i++)
{
if(mp[u][v]&(1<<i))
printf("%c",i+'a');
}
}
else
printf("-");
puts("");
scanf("%d %d",&u,&v);
}
puts("");
}
}