建二分图,求最大独立集(点数减去最大匹配)
题目的模型好像是叫最长反链,对二分图各种不熟啊,补补补
#include<cstdio>
#define N 105
using namespace std;
int read()
{
int a=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){a=a*10+c-'0';c=getchar();}
return a*f;
}
int n,m,mark,ans;
int d[N][N],link[N],v[N];
int find(int x)
{
for(int i=1;i<=n;++i)
if(i!=x&&d[x][i]&&v[i]!=mark)
{
v[i]=mark;
if(!link[i]||find(link[i]))
{
link[i]=x;
return 1;
}
}
return 0;
}
int main()
{
n=read(),m=read();
for(int i=1,x,y;i<=m;++i)
{
x=read(),y=read();
d[x][y]=1;
}
for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
d[i][j]=d[i][j]|(d[i][k]*d[k][j]);
for(int i=1;i<=n;++i)
{
++mark;
ans+=find(i);
}
printf("%d\n",n-ans);
return 0;
}