POJ 2570 Fiber Network(floyd闭包)

来源:互联网 发布:王献之 洛神赋 知乎 编辑:程序博客网 时间:2024/04/29 04:30

因为小写字母最多26个,公司也就最多26个,所以用一个int的位来存储公司即可。

G++ T到死,C++235ms。

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn=200+5;int line[maxn][maxn];int n;char cmd[30];void floyd(){    for(int k=1;k<=n;k++)    {        for(int i=1;i<=n;i++)        {            for(int j=1;j<=n;j++)            {                line[i][j]|=(line[i][k]&line[k][j]);            }        }    }}int main(){    while(scanf("%d",&n)&&n)    {        memset(line,0,sizeof(line));        int x,y;        while(scanf("%d%d",&x,&y)&&(x+y))        {            scanf("%s",cmd);            for(int i=0;cmd[i];i++)            {                line[x][y]|=(1<<(cmd[i]-'a'));            }        }        floyd();        while(scanf("%d%d",&x,&y)&&(x+y))        {            int tmp=line[x][y];            bool have=false;            for(int i=0;(1<<i)<=tmp;i++)                if(((1<<i)&tmp)) {have=true;printf("%c",i+'a');}            if(!have) printf("-");            printf("\n");         }        printf("\n");    }    return 0;}


0 0