P1330 封锁阳光大学
Posted ukcxrtjr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
");
return 0;
}
ans+=min(sum0,sum1);
}
printf("%d
",ans);
return 0;
}
以上是关于P1330 封锁阳光大学的主要内容,如果未能解决你的问题,请参考以下文章