显然要求最小反链长度,转化为最小链覆盖,我好像只会最小路径覆盖?那就floyd一遍好了…>_<…,你问我ctsc原题要输出方案?很抱歉我也不会…有哪位神犇会dilworth定理输出方案求教…
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
//by:MirrorGray
using namespace std;
const int N=211;
int n,tim,map[N][N],pp[N],vis[N];
int dfs(int x){
for(int i=1;i<=n;i++)if(map[x][i]){
if(vis[i]==tim)continue;
vis[i]=tim;
if(!pp[i]||dfs(pp[i])){
pp[i]=x;
return true;
}
}
return false;
}
int main(){
int m;scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int a,b;scanf("%d%d",&a,&b);
map[a][b]=true;
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]|=map[i][k]&map[k][j];
int ans=n;
for(int i=1;i<=n;i++)tim++,ans-=dfs(i);
printf("%d\n",ans);
return 0;
}