整理日期按学习顺序编排,不代表原始发表时间。实际整理于 2026-10-23。
难度为阅读建议,可从 ACM 学习索引 按阶段阅读。
时间复杂度是 O(n+m), n 表示点数,m 表示边数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| bool dfs(int u,int c){ color[u]=c; for(auto v:e[u]){ if(!color[v]){ if(dfs(v,3-c))return 1; } else if(color[v]==c)return 1; } return 0; } bool check() { fill(color,color+1+n,0); bool flag = true; for (int i = 1; i <= n; i ++ ) if (!color[i] ) if (dfs(i, 1)) { flag = false; break; } return flag; }
|
时间复杂度是 O(nm), n 表示点数,m 表示边数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| int ans=0; vector<int>e[N]; int vis[N],match[N]; bool dfs(int u){ for(auto v:e[u]){ if(vis[v]) continue; vis[v]=1; if(!match[v]||dfs(match[v])){ match[v]=u; return 1; } } return 0; } void solve(){ int k; cin>>n>>m>>k; for(int i=1;i<=k;i++){ int u,v;cin>>u>>v; e[u].push_back(v); } for(int i=1;i<=n;i++){ fill(vis,vis+m+1,0); if(dfs(i))ans++; } cout<<ans; }
|