计蒜客习题:距离序列(匈牙利算法)
题面:
已知序列长度N,序列Qi,Si,求满足Qi=min{ |Si-Ti|, N - |Si-Ti| }的字典序最小的Ti序列 (Ti是Si的一个排序);
按照二分图匹配的匈牙利算法的思想,把Si当作X集合,(Ti+N)当作Y集合;
遍历1~N将符合条件的边存放(若用链式前向星存边需要从大往小存(p[u]指向的是顶点最大的边));
在匹配时,如果从前向后匹配,会得到一个字典序最大的序列(这就是从大到小存边的原因);
所以匹配时从后向前匹配,这样靠后的Si就会匹配到最大的值,这样就可以得到字典序最小的序列。
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN=(1e4+1)*2;
int p[MAXN],eid;
struct edge
{
int v,next;
}e[MAXN*2];
void insert(int u,int v)
{
e[eid].v=v;
e[eid].next=p[u];
p