湖大OJ-实验E----可判定的DFA的空问题

实验E----可判定的DFA的空问题
Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB
Total submit users: 138, Accepted users: 130
Problem 13122 : No special judgement
Problem description

  EDFA={< B >|B是DFA,且L(A)=Ф} 证明:EDFA是可判定的语言。 实验方法:编写一个算法/程序,对于任意给定的输入(/确定性有限状态自动机DFA),可以判定EDFA

Input

  有多个测试序列,测试结束于测试文件结束;
  每个测试序列相对应一个DFA,其第一行为2个正整数n,m,表示有n个状态,状态集Q={q0,q1,…,qn-1}。默认起始状态为q0,字符集有m个字符。0 < n,m ≤100。随后n行,每行m个空格隔开的整数δij,( 0 ≤ i < n , 0 ≤ j < m )表示DFA的状态转移函数。δij表示第i个状态在输入j(字母表第j个字符)时,变为第δij个状态。每个DFA的最后一行,首先一个整数f,表示接受状态数,然后f个空格隔开的整数fk(0 ≤ k < f),是所有接受状态的编号。其中 0 ≤ δij,fk < n。

Output

  对于每个输入的DFA,输出”YES”,如果该DFA确实不接受任何串;否则,输出”NO”。 

Sample Input
  1 2
  0 0
  1 0
  1 2
  0 0
  0
Sample Output
  NO
  YES
Judge Tips

  样例中2个DFA,第一个是接受所有输入的DFA,第二个是拒绝所有输入的DFA,所以,第一个DFA输出”NO”,而第二个是”YES”。

1、算法设计思路

  A: <DFA  B>是否接受w的问题。ADFA是可判定的。ANFA是可判定的。ARES是可判定的。EDFA是可判定的。EQDFA是可判定的。P100。核心思想:图灵机跟踪DFA的状态和当前位置,状态和位置的变化由转移函数决定。

  B: DFA不接受任意串存在以下几种情况:没有接受状态、接受状态独立、接受状态和起始状态不在同一个团中;基于以上三种情况编写代码

2、实验总结

不要去根据DFA可能接受某一个串去判断一个DFA大的可判定性,而是从相反的方向来考虑问题:即判断DFA是否拒绝所有的串。DFA拒绝所有的串只可能存在以上三种情况。

3、AC代码

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
using namespace std;
bool vis[110];
bool ac[110];
int num[110][110];
int n, m, f, p, cnt;
bool dfs(int k)
{
    vis[k] = 1;
    if(ac[k])
    {
        return 1;
    }
    for(int i = 0; i < m; i++)
        if(!vis[num[k][i]] && dfs(num[k][i]))
        {
            return 1;
        }
    return 0;
}
int main()
{
    while(scanf("%d%d", &n, &m)!=EOF)
    {
        memset(vis, 0, sizeof(vis));
        memset(ac, 0, sizeof(ac));
        for(int i = 0; i < n; i++)
            for(int j = 0; j < m; j++)
                scanf("%d", &num[i][j]);
        scanf("%d", &f);
        for(int i = 0; i < f; i++)
        {
            scanf("%d", &p), ac[p] = 1;
        }
        if(f)
            if(dfs(0))
                printf("NO\n");
            else
                printf("YES\n");
        else
            printf("YES\n");
    }
    return 0;
}

转载于:https://www.cnblogs.com/pengfeiz/p/5974680.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值