有点难以理解?
/************************************************************** Problem: 1143 User: lxy8584099 Language: C++ Result: Accepted Time:32 ms Memory:864 kb ****************************************************************/ /* Floyd跑出每个点之间的连通性 连通则不能一起选择 所以转化为求有向无环图的最小点覆盖(一般来说 选到的点都是DAG末端的 转化为二分图 就是 n-最大匹配数 */ #include<cstdio> using namespace std; const int N=105; int n,m,d[N][N],vis[N],fa[N],tot; bool dfs(int u,int t) { for(int v=1;v<=n;v++) if(d[u][v]&&vis[v]^t) { vis[v]=t; if(!fa[v]||dfs(fa[v],t)) { fa[v]=u;return 1; } } return 0; } int main() { scanf("%d%d",&n,&m); for(int i=1,u,v;i<=m;i++) scanf("%d%d",&u,&v),d[u][v]=1; for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(d[i][k]&&d[k][j]) d[i][j]=1; for(int i=1;i<=n;i++) if(dfs(i,i)) tot++; printf("%d\n",n-tot); return 0; }