int main() { int N, K; scanf("%d%d", &N, &K); Dinic dinic; const int S = 0, T = 2*N + 1; for (int i = 1; i <= N; i++) { dinic.addEdge(S, i, 1); } for (int i = N+1; i <= 2*N; i++) { dinic.addEdge(i, T, 1); } for (int i = 0; i < K; i++) { int r, c; scanf("%d%d", &r, &c); dinic.addEdge(r, N+c, Dinic::inf); } printf("%d\n", dinic.dinic(S, T)); return 0; }
int main() { scanf("%d%d%d%d", &N, &M, &C1, &C2); Dinic dinic; dinic.addEdge(2*C1, 2*C1+1, Dinic::inf); dinic.addEdge(2*C2, 2*C2+1, Dinic::inf); for (int i = 1; i <= M; i++) { int u, v; scanf("%d%d", &u, &v); dinic.addEdge(2*u+1, 2*v, Dinic::inf); dinic.addEdge(2*v+1, 2*u, Dinic::inf); } for (int i = 1; i <= N; i++) { if (i != C1 && i != C2) { dinic.addEdge(2*i, 2*i+1, 1); } } printf("%d\n", dinic.dinic(2*C1, 2*C2+1)); return 0; }
void solve() { mp[1].clear(); mp[2].clear(); int n1 = 0, n2 = 0; for(int i = 1; i <= n; i++) { if(mp[1][a[i][1]] == 0) { n1++; mp[1][a[i][1]] = n1; b[i][1] = n1; } else { b[i][1] = mp[1][a[i][1]]; } if(mp[2][a[i][2]] == 0) { n2++; mp[2][a[i][2]] = n2; b[i][2] = n2; } else { b[i][2] = mp[2][a[i][2]]; } } g.init(); int st = n1 + n2 + 1, ed = st + 1; for(int i = 1; i <= n1; i++) { g.addEdge(st, i, 1); } for(int i = 1; i <= n2; i++) { g.addEdge(i + n1, ed, 1); } for(int i = 1; i <= n; i++) { g.addEdge(b[i][1], n1 + b[i][2], 1); } int ans = g.Maxflow(st, ed, INF); //printf("%d %d %d\n", n1, n2, ans); printf("%d\n", n - (n2 - ans) - n1); }