- 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; }