HDU 5487 Difference of Languages(BFS)

HDU 5487 Difference of Languages

 

这题从昨天下午2点开始做,到现在才AC了。感觉就是好多题都能想出来,就是写完后debug很长时间,才能AC,是不熟练的原因吗?但愿孰能生巧吧。

BFS转移的是两个DFA的状态,用typedef pair<int,int> pi;map<pi,pi> pres;      两步储存前后状态的链接。

附上一组测坑数据:

/*
432
4 3 1
3
0 1 a
1 2 e
2 3 w
6 3 1
5
0 1 a
1 3 e
3 5 h
*/

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
#include <queue>
#include <vector>
using namespace std;
int n1,m1,k1;
int n2,m2,k2;
const int maxn = 1005;
int ac1[maxn];
int ac2[maxn];
map<char,int> mp1;
map<int,char> mp2;
int g1[maxn][30];
int g2[maxn][30];
int vis[maxn][maxn];
typedef pair<int,int> pi;
map<pi,pi> pres;
int a[maxn][maxn];
int flag = 0;
struct edge
{
    int st1,st2;
};
edge ans;
void pre()
{
    for(int i=1;i<=26;i++)
    {
        char c = 'a'+i-1;
        mp1[c]=i;
        mp2[i]=c;
    }
}
void inin()
{
    for(int i=0;i<maxn;i++)
    {
        ac1[i] = 0;
        ac2[i] = 0;
    }
    memset(g1,-1,sizeof(g1));
    memset(g2,-1,sizeof(g2));
    memset(vis,0,sizeof(vis));
    memset(a,0,sizeof(a));
    pres.clear();
}
bool check(int u,int c)
{
    if(ac1[u]!=ac2[c])
        return false;
    return true;
}
void bfs()
{
    queue<edge> q;
    edge cur;
    q.push((edge){0,0});
    ans = {0,0};
    flag = 0;
    while(!q.empty())
    {
        cur = q.front();
        q.pop();
        if(!check(cur.st1,cur.st2))
        {
            ans = cur;
            flag = 1;
            return;
        }
        for(int i=1;i<=26;i++)
        {
            int v1 = g1[cur.st1][i];
            int v2 = g2[cur.st2][i];
            if(!vis[v1][v2])
            {
                vis[v1][v2] = 1;
                q.push((edge){v1,v2});
                pres[pi(v1,v2)] = make_pair(cur.st1,cur.st2);
                a[v1][v2] = i;
            }
        }
    }
}
int main()
{
    pre();
    int t;
    int kase = 0;
    cin>>t;
    while(t--)
    {
        int u,v,x;
        char c;
        inin();
        cin>>n1>>m1>>k1;
        for(int i=1;i<=k1;i++)
        {
             scanf("%d",&x);
             ac1[x] = 1;
        }
        for(int i=1;i<=m1;i++)
        {
            scanf("%d %d %c",&u,&v,&c);
            g1[u][mp1[c]] = v;
        }
        cin>>n2>>m2>>k2;
        for(int i=1;i<=k2;i++)
        {
             scanf("%d",&x);
             ac2[x] = 1;
        }
        for(int i=1;i<=m2;i++)
        {
            scanf("%d %d %c",&u,&v,&c);
            g2[u][mp1[c]] = v;
        }
        g1[0][0] = 0;
        g2[0][0] = 0;
        for(int i=0;i<=n1;i++)     //下面两步是防止 最后ac1[u]和ac2[c]索引为负。
            for(int j=1;j<=26;j++)
            if(g1[i][j]==-1) g1[i][j]=n1;
        for(int i=0;i<=n2;i++)
            for(int j=1;j<=26;j++)
            if(g2[i][j]==-1) g2[i][j]=n2;
        bfs();
        printf("Case #%d: ",++kase);
        if(!flag)
        {
            printf("0\n");
            continue;
        }
        vector<int> buffer;
        pi cur;
        while(pres.count(pi(ans.st1,ans.st2))&&(ans.st1!=0||ans.st2!=0))
        {
            buffer.push_back(a[ans.st1][ans.st2]);
            cur = pres[pi(ans.st1,ans.st2)];
            ans.st1 = cur.first;
            ans.st2 = cur.second;
        }
        reverse(buffer.begin(),buffer.end());
        for(int i=0;i<buffer.size();i++)
        {
            printf("%c",buffer[i]+'a'-1);
        }
        printf("\n");
    }
    return 0;
}
/*
432
4 3 1
3
0 1 a
1 2 e
2 3 w
6 3 1
5
0 1 a
1 3 e
3 5 h
*/

 

posted @ 2016-07-26 09:52  卷珠帘  阅读(207)  评论(0编辑  收藏  举报