洛谷-p2764(最小路径覆盖)(网络流24题)
#include<iostream> #include<algorithm> #include<queue> #include<cstring> #include<cstdio> #define maxn 300 #define maxm 15000 using namespace std; struct Edge { int next; int to; int w; }edge[maxm]; int x,y; int head[maxm]; int cx[maxm]; int cy[maxm]; bool visit[maxm]; int n,m,cnt; void add(int u,int v) { edge[cnt].next=head[u]; edge[cnt].to=v; head[u]=cnt++; } bool dfs(int x) { for(int i=head[x];i!=-1;i=edge[i].next) { int v=edge[i].to; if(!visit[v]) { visit[v]=1; if(!cy[v]||dfs(cy[v])) { cx[x]=v;cy[v]=x; return 1; } } } return 0; } int hungary() { int cot=0; for(int i=1;i<=n;i++) { if(!cx[i]) { memset(visit,0,sizeof(visit)); cot+=dfs(i); } } return cot; } void pri(int u) { u=u+n; do printf("%d ",u=u-n); while(visit[u]=1,u=cx[u]); printf("\n"); } int main() { memset(head,-1,sizeof(head)); cnt=0; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); add(x,y+n); add(y+n,x); } int ans=hungary(); memset(visit,0,sizeof(visit)); for(int i=1;i<=n;i++) { if(!visit[i]) { pri(i); } } printf("%d\n",n-ans); }