【数据范围】
对于30%的数据,保证N < =1000
对于100%的数据,保证N < =1000000
Solution
一开始想二分图是在属性之间连边,发现根本不可做啊!
然而正解非常巧妙了!在属性和武器之间连边,每次按顺序去看属性是否可以找到匹配(因为每个武器只能用一次),直到找不到匹配即可。
Code
#include<bits/stdc++.h> using namespace std; int n; struct Node { int v, nex; } Edge[2000005]; int stot, h[1000005]; void add(int u, int v) { Edge[++stot] = (Node) {v, h[u]}; h[u] = stot; } int vis[1000005], to[1000005], idc; bool find(int u) { for(int i = h[u]; i; i = Edge[i].nex) { int v = Edge[i].v; if(vis[v] != idc) { vis[v] = idc; if(!to[v] || find(to[v])) { to[v] = u; return 1; } } } return 0; } int main() { scanf("%d", &n); for(int i = 1; i <= n; i ++) { int x, y; scanf("%d%d", &x, &y); add(x, i); add(y, i); } int i; for(i = 1; i <= 10000; i ++) { ++ idc; if(!find(i)) break; } printf("%d", i - 1); return 0; }
原文:https://www.cnblogs.com/wans-caesar-02111007/p/9873546.html