P1330 封锁阳光大学

题面:https://www.luogu.org/problem/P1330

本题直接将相邻点染成不同的颜色,遇到染不了的就输出Impossible
然后每次统计染色点数少的加起来就行了.

Code:
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=500005;
int n,m,cnt,head[N],ans,sum0,sum1;
int col[N];
bool flag=true,vis[N];
struct Node{
	int v,nxt;
}edge[N];
void add(int u,int v){
	++cnt;
	edge[cnt].v=v;
	edge[cnt].nxt=head[u];
	head[u]=cnt;
}
void dfs(int u,int fa){
	if(col[u]==0){
		sum0++;
	}
	else{
		sum1++;
	}
	for(int i=head[u];i;i=edge[i].nxt){
		int v=edge[i].v;
		if(v!=fa){
			if(col[v]!=-1){
				flag=false;
				return;
			}
			col[v]=col[u]^1;
			vis[v]=1;
			dfs(v,u);
		}
	}
	return;
}
int main(){
	int u,v;
	scanf("%d%d",&n,&m);
	memset(col,-1,sizeof(col));
	for(int i=1;i<=m;i++){
		scanf("%d%d",&u,&v);
		add(u,v);
		add(v,u);
	}
	for(int i=1;i<=n;i++){
		sum0=sum1=0;
		if(!vis[i]){
			col[i]=1;
			dfs(i,-1);
		}
		if(!flag){
			printf("Impossible\n");
			return 0;
		}
		ans+=min(sum0,sum1);
	}
	printf("%d\n",ans);
    return 0;
}
posted @ 2019-09-30 13:18  prestige  阅读(109)  评论(0编辑  收藏  举报