POJ 2570 floyd(传递闭包+状态压缩)

来源:互联网 发布:mac 百度云下载太慢 编辑:程序博客网 时间:2024/04/30 15:03

把图中边的连通状态(一条边有几个公司公用)压缩成二进制。

通过G[i][j]=G[i][j]|(G[i][k]&G[k][j]);  完成floyd的传递闭包,其实也就是状态转移。


#include<cstdio>#include<cstring>int G[205][205];void floyd(int n){    for(int k=1;k<=n;k++)    {        for(int i=1;i<=n;i++)        {            if(G[i][k]==0) continue;            for(int j=1;j<=n;j++)            {                G[i][j]=G[i][j]|(G[i][k]&G[k][j]);            }        }    }}int main(){    int n;    while(scanf("%d",&n)&&n)    {        memset(G,0,sizeof(G));        char str[30];        int a,b;        while(scanf("%d%d",&a,&b)&&(a||b))        {            scanf("%s",str);            int len=strlen(str);            for(int i=0;i<len;i++)            {                G[a][b]+=(1<<(str[i]-'a'));            }        }        floyd(n);        while(scanf("%d%d",&a,&b)&&(a||b))        {            bool is_print=0;            //printf("ans=%d\n",G[a][b]);            for(int i=0;i<26;i++)            {                if((1&G[a][b]>>i)==0) continue;                putchar(i+'a');                is_print=1;            }            if(is_print==0) putchar('-');            putchar('\n');        }        putchar('\n');    }    return 0;}


0 0
原创粉丝点击