您的位置:首页 > 其它

POJ2570 Fiber Network(Floyd)

2016-01-03 14:49 190 查看
d[i][j]表示从i点到j点可以全程提供光纤的公司的集合,集合用26位的二进制压缩。

那么状态转移方程就是dk[i][j]|=dk-1[i][k]&dk-1[k][j]。

#include<cstdio>
#include<cstring>
using namespace std;
int n,d[222][222];
void Floyd(){
for(int k=1; k<=n; ++k){
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
d[i][j]|=d[i][k]&d[k][j];
}
}
}
}
int main(){
int a,b;
char str[33];
while(~scanf("%d",&n) && n){
memset(d,0,sizeof(d));
while(~scanf("%d%d",&a,&b) && a){
scanf("%s",str);
int c=0;
for(int i=0; str[i]; ++i) c|=1<<str[i]-'a';
d[a][b]=c;
}
Floyd();
while(~scanf("%d%d",&a,&b) && a){
if(d[a][b]==0){
puts("-");
continue;
}
for(int i=0; i<26; ++i){
if((d[a][b])>>i&1) putchar(i+'a');
}
putchar('\n');
}
putchar('\n');
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: