转对偶图
Lid
, Rid
分别是每条边左右的区域的编号;
to[x]
,fr[x]
分别是 \(x\) 指出去和指向 \(x\) 的边 (从左往右排列);
void build(){
static queue <int> Q;
Q.push(S);
while(!Q.empty()){
int x = Q.front(); Q.pop();
if(!to[x].size()) continue;
int a = (int) to[x].size() - 1, b = (int) fr[x].size() - 1;
Lid[to[x][0].se] = ~b ? Lid[fr[x][0].se] : ++id;
Rid[to[x][a].se] = ~b ? Rid[fr[x][b].se] : ++id;
if(x == S) st = Lid[to[x][0].se], ed = Rid[to[x][a].se];
lfor(i, 1, a) Lid[to[x][i].se] = Rid[to[x][i - 1].se] = ++id;
lfor(i, 0, a){
add(Lid[to[x][i].se], Rid[to[x][i].se]);
if(!(--in[to[x][i].fi])) Q.push(to[x][i].fi);
}
}
}