在有向无环图里求最大的不可达点集
数据不是很大,在求完可达矩阵后跑一下最大匹配,总点数-最大匹配为answer
http://exam.upc.edu.cn/problem.php?id=5211&csrf=PvC6HBdKLS1QHaGclJWJInKE4QHChtco
#include<bits/stdc++.h>
#define debug puts("^^^^^^^")
#define read(x) scanf("%d",&x)
using namespace std;
const int maxn=102;
const int inf=0x3f3f3f3f;
int ma[maxn][maxn];
int n,m;
int s[maxn];
int vis[maxn];
int ans=0;
bool dfs(int x) {
for(int i=1;i<=n;i++) {
if(ma[x][i]&&!vis[i])
{
vis[i]=1;
if(s[i]==-1||dfs(s[i]))
{
s[i]=x;
return true;
}
}
}
return false;
}
void work() {
for(int i=1;i<=n;i++) {
memset(vis,0,sizeof(vis));
if(dfs(i))ans++;
}
printf("%d\n",n-ans);
}
int main() {
int T;
read(T);
while(T--) {
read(n),read(m);
memset(ma,0,sizeof(ma));
for(int i=1;i<=m;i++) {
int f,t;
read(f),read(t);
ma[f][t]=1;
}
for(int k=1;k<=n;k++) {
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
if(ma[i][k]==1 && ma[k][j]==1) {
ma[i][j]=1;
}
}
}
}
memset(s,-1,sizeof(s));
ans=0;
work();
}
}