hdu 5487 Difference of Languages BFS

来源:互联网 发布:魔灵召唤淘宝代充 编辑:程序博客网 时间:2024/05/18 01:32

题意:给你两个DFA,每个状态在另一个字母的作用下变成另一个状态。其字典序最小的一个字符串,使得其中一个变成可接受的状态,另一个不是。
方法:bfs枚举最后的状态,并记录第一个状态。

#include<iostream>#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>#pragma comment(linker,"/STACK:1024000000,1024000000")using namespace std;const int N=1005;const int M=26;bool vis[N][N];struct state{    bool ac[N];int nex[N][M];    int n,m,K;    void init(){        scanf("%d%d%d",&n,&m,&K);        int u,v;char c[3];        memset(ac,0,sizeof(ac));        for(int i=0;i<=n;i++)            for(int j=0;j<M;j++)                nex[i][j]=n;        for(int i=0;i<K;i++){            scanf("%d",&u);ac[u]=true;        }        for(int i=0;i<m;i++){            scanf("%d%d%s",&u,&v,c);            nex[u][c[0]-'a']=v;        }    }}A,B;struct node{    int x,y;    node(int _x=0,int _y=0):x(_x),y(_y){}}Cur;queue<node>q;int pre[N][N];void out(int x,int y){    int xx,yy,c,st;    c=pre[x][y]%M;    st=pre[x][y]/M;    xx=st/N;yy=st%N;    if(pre[xx][yy]!=-1)        out(xx,yy);    printf("%c",'a'+c);}bool solve(){    if(A.ac[0]^B.ac[0]){        printf("\n");return true;    }    while(!q.empty())q.pop();    memset(vis,0,sizeof(vis));    //memset(pre,-1,sizeof(pre));    for(int i=0;i<=A.n;i++)        for(int j=0;j<=B.n;j++)            pre[i][j]=-1;    vis[0][0]=true;    q.push(node(0,0));    while(!q.empty()){        Cur=q.front();q.pop();        int p=Cur.x*N+Cur.y;        for(int i=0;i<M;i++){            int x=A.nex[Cur.x][i];            int y=B.nex[Cur.y][i];            if(vis[x][y])continue;            vis[x][y]=true;            pre[x][y]=p*M+i;            if(A.ac[x]^B.ac[y]){                out(x,y);                printf("\n");                return true;            }            q.push(node(x,y));        }    }    return false;}void work(){    int T;    scanf("%d",&T);    int tt=1;    while(T--){        printf("Case #%d: ",tt++);        A.init();B.init();        if(!solve())printf("0\n");    }}int main(){    //freopen("data_in.txt","r",stdin);    work();    return 0;}
0 0
原创粉丝点击