洛谷 P1330 封锁阳光大学

P1330 封锁阳光大学

用二分图的构造方式即可,找到两种颜色最小值加起来,注意:图不连通。

#include <bits/stdc++.h>
using namespace std;

int n,m;
int color[10005];
int vis[10005];
int p=0;
int x,y;

vector<int> v[10005]; 

void dfs(int k,int fa){
	vis[k]=1;
	if(color[fa]==1){
		color[k]=0;
		y++;
	}
	else if(color[fa]==0){
		color[k]=1;
		x++;
	}
	for(int i=0;i<v[k].size();i++){
		int yy= v[k][i];
		if(color[yy]==color[k]){
			p=1;
			return ;
		}
		else{
			if(vis[yy]==0){
				dfs(yy,k);
			}
		}
	}
	return;
}

int main(){
    ios::sync_with_stdio(false);
	memset(color,-1,sizeof color);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,vv;
		cin>>u>>vv; 
		v[u].push_back(vv);
		v[vv].push_back(u);
	}
	int ans=0;
	color[0]=1;
	for(int i=1;i<=n;i++){
		if(vis[i]==0&&v[i].size()>=1){
			x=0;
			y=0;
			dfs(i,0);
			ans+=min(x,y);
		}
	}
	if(p==0){
		cout<<ans;
	}
	else{
		cout<<"Impossible";
	}
    return 0;
}
posted @ 2024-09-17 23:17  sad_lin  阅读(3)  评论(0编辑  收藏  举报