#include <iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include<iomanip>
#include <stack>
using namespace std;
typedef long long LL;
const int INF=0x7fffffff;
const int MAX_N=60;
int num_of_edge,num_of_v;
int num_of_jihe;
int num_of_start,num_of_end,num_of_final;
int res[10000][10];
int startnode[100];
int endnode[100];
int finalnode[100];
struct edge{
int to;
char v;
edge(int a,char b){
to=a;
v=b;
}
};
vector<edge>G[MAX_N];
map<int,int>s;
map<int,int>::iterator a;
int vis[MAX_N];
char V[10];
void change(int ans){//将一个集合输出
int cur=ans;
int p=0;
if(ans==0){
printf("( NULL )");
return;
}
printf("( ");
while(cur>0){
if(cur&1==1)printf("%d ",p);
cur>>=1;
p++;
}
printf(")");
}
int dfs(int from,char key){//from代表从编号为from的点开始dfs,key代表要经过的权值
int ans=0;//初始化集合为空
if(key=='0'){//如果要dfs空
for(int i=0;i<G[from].size();i++){
if(G[from][i].v==key&&vis[G[from][i].to]==0){
ans|=(1<<G[from][i].to);//把要去的点并进集合
vis[G[from][i].to]=1;//为了避免重复将走过的点标记为1,没走过的再走
ans|=dfs(G[from][i].to,key);//递归地调用dfs
}
}
ans|=(1<<from);//不能落下起点啊
}
else{//这是dfs权值不为0的路径,因为只走一步,并且自己不算集合里,所以不用递归,最后也不用并起点
for(int i=0;i<G[from].size();i++){
if(G[from][i].v==key){
ans|=(1<<G[from][i].to);
}
}
}
return ans;
}
void bfs(){
queue<int>q;
int a=0;
for(int i=0;i<num_of_start;i++){
a|=dfs(startnode[i],'0');
}
q.push(a);
int n=1;
s.insert(make_pair(a,n++));
while(!q.empty()){
int f=q.front();
q.pop();
num_of_jihe++;
res[num_of_jihe][0]=f;
for(int i=0;i<num_of_v;i++){
int cur=f;
int p=0;
int ans=0;
while(cur>0){
if(cur&1==1)ans|=dfs(p,V[i]);
p++;
cur>>=1;
}
cur=ans;
p=0;
ans=0;
while(cur>0){
memset(vis,0,sizeof(vis));
if(cur&1==1)ans|=dfs(p,'0');
p++;
cur>>=1;
}
res[num_of_jihe][i+1]=ans;
// change(ans);
if(s.find(ans)==s.end()&&ans!=0){
q.push(ans);
s.insert(make_pair(ans,n++));
// change(ans);
// cout<<"插入ans:"<<endl;
}
}
}
}
void input(){
printf("******************************* NFA—DFA转化 ***********************************\n");
printf("请输入边的个数:");
scanf("%d",&num_of_edge);
printf("请输入弧转换种类个数:");
scanf("%d",&num_of_v);
printf(&#
NFA-DFA(c++实现代码c#实现画图)
最新推荐文章于 2024-04-22 15:13:45 发布