题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1143
题意:给出一个有向无环图。在其中找出一个最大的点集使得点集中任意两个点之间不可达。
思路:首先在给出图中跑一次floyd,这样g[i][j]=1则i可到达j。那么题意就是求最大独立集。最大独立集=|G|-最小顶点覆盖=|G|-二分图最大匹配。
int g[N][N],match[N],visit[N];
int n;
int DFS(int u)
{
int i;
FOR1(i,n) if(!visit[i]&&g[u][i])
{
visit[i]=1;
if(match[i]==-1||DFS(match[i]))
{
match[i]=u;
return 1;
}
}
return 0;
}
int m;
int main()
{
RD(n,m);
int i,x,y;
FOR1(i,m)
{
RD(x,y);
g[x][y]=1;
}
int j,k;
FOR1(k,n) FOR1(i,n) FOR1(j,n) if(g[i][k]&&g[k][j])
{
g[i][j]=1;
}
clr(match,-1);
int ans=0;
FOR1(i,n)
{
clr(visit,0);
if(DFS(i)) ans++;
}
PR(n-ans);
}