书上的伪代码:
第一步:
求初始状态s通过ε到达的所有点的集合*U[0];
部分代码展示:
int ii=0,jj=0; int U[ns][ns];for(ii=0;ii<ns;ii++)for(jj=0;jj<ns;jj++)U[ii][jj]=0; int l=0,curr=1,r=1,i=0; U[0][0]=1;//一个 U[0][1]=1;//初始结点 //在这里再加一个求初始状态只通过“一盆西罗”到达的所有点, //并存在U[0][];中,并记录个数U[0][0] while(r>l){ l++; for(i=0;i<n;i++){//遍历所有的出边 for(j=1;j<=U[l-1][0];j++){//遍历当前扩展集合的所有点 for(k=1;k<=tran[U[l-1][j]][0];k++){//遍历当前点所有的边 if(a[i]==b[U[l-1][j]][k]){//如果有这条边,新建一个集合 U[curr][U[curr][0]]=tran[U[l-1][j]][k]; U[curr][0]++; } } } //εεεεεεεεεεεεεεεεεεεεεε //在这里再加一个当前求得的集合只通过 //“一盆西罗”到达的所有点, //并存在U[curr][];中,并记录个数U[curr][0] //然后再加一个判断的条件: //for()循环判断之前的U[][]和现在的U[curr][]是否有重复 //如果有重复,做标记:judge=1; if(judge==0){//和之前没有重复 curr++;//加进去 } } }