题意:
找出不能相互访问的点集的集合的元素数量。
思路:
偏序集最长反链裸题。
代码:
#include<iostream> #include<cstring> using namespace std; const int maxn=105; int g[maxn][maxn]; int uN,vN; int linker[maxn]; bool used[maxn]; bool dfs(int u) { for(int v = 0; v < vN; v++) if(g[u][v] && !used[v]) { used[v] = true; if(linker[v] == -1 || dfs(linker[v])) { linker[v] = u; return true; } } return false; } int hungary() { int res = 0; memset(linker,-1,sizeof(linker)); for(int u = 0; u < uN; u++) { memset(used,false,sizeof(used)); if(dfs(u))res++; } return res; } int main() { int n,m,t; cin>>t; while (t--) { cin>>n>>m; memset(g,0,sizeof(g)); for (int i=1; i<=m; i++) { int u,v; cin>>u>>v; g[u-1][v-1]=1; } for (int k=0; k<n; k++) for (int i=0; i<n; i++) for (int j=0; j<n; j++) if (g[i][k] && g[k][j]) g[i][j]=1; uN=vN=n; cout<<n-hungary()<<endl; } return 0; }