DFA 最小化_算法
JueFan 一只绝帆

这里是好写的高复杂度写法,外层枚举字符不断分裂节点,mrk 是接受状态,to[u][v] 是颜色为 uu 的点指向颜色为 vv 的点会分配为什么颜色。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int col[N],n,ch[N][S];
std::map<int,int> to[N];
bool hopcraft() {
bool ok=false;
F(c,0,S-1) {
F(i,1,col[0]) to[i].clear();
F(u,1,n) {
int v=ch[u][c]?col[ch[u][c]]:-1;
if(!to[col[u]][v]) {
if(!to[col[u]].empty()) to[col[u]][v]=++col[0],ok=true;
else to[col[u]][v]=col[u];
}
}
F(u,1,n) {
int v=ch[u][c]?col[ch[u][c]]:-1;
col[u]=to[col[u]][v];
}
}
return ok;
}
void work(bool *mrk) {
F(u,1,n) col[u]=mrk[u];
col[0]=1;
while(hopcraft());
}
 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
总字数 231.7k 访客数 访问量