- P1330 封锁阳光大学
- 染色:
-
#include<bits/stdc++.h> using namespace std; #define maxn 22345 int n,m,a,b,cnt,head[maxn]; int ans,sum[5],color[maxn]; bool used[maxn]; struct node { int v,to; } edge[maxn*10]; void add(int u,int v) { edge[++cnt].v=v; edge[cnt].to=head[u]; head[u]=cnt; } bool dfs(int id,int col) { if(used[id]) { if(color[id]!=col)return false; return true; } sum[color[id]=col]++; used[id]=1; bool re=1; for(int i=head[id]; i!=-1; i=edge[i].to) re=(re&dfs(edge[i].v,1-col)); return re; } int main() { memset(head,-1,sizeof(head)); scanf("%d%d",&n,&m); while(m--) { scanf("%d%d",&a,&b); add(a,b); add(b,a); } for(int i=1; i<=n; i++) { if(used[i])continue; sum[0]=sum[1]=0; if(!dfs(i,0)) { printf("Impossible\n"); return 0; } ans+=min(sum[0],sum[1]); } printf("%d\n",ans); return 0; }
P1330 封锁阳光大学-二分图染色
最新推荐文章于 2025-11-29 00:15:00 发布
本文深入探讨了二分图匹配算法的实现细节,通过一个具体的C++代码示例,展示了如何使用DFS深度优先搜索来解决二分图的最大匹配问题。文章首先定义了基本的数据结构,包括节点和边的定义,然后详细解释了如何通过递归调用DFS函数来遍历图,并检查每条边的有效性。最后,通过最小匹配数的计算,得出了最优解。
155

被折叠的 条评论
为什么被折叠?



