标签:封锁 int 染色 while char 阳光 include P1330 getchar
01染色,取染色个数较小的。
注意图不一定联通。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=100005;
int n,m;
int head[N];
int c[N];
bool vis[N];
int sum[2];
int tot,ans;
int read(){
int num=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
num=num*10+c-'0';
c=getchar();
}
return num*f;
}
struct node{
int to,next;
}edge[N<<1];
void add(int u,int v){
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
}
bool dfs(int u,int color){
if(vis[u]){
if(color!=c[u]) return 0;
return 1;
}
vis[u]=1;
c[u]=color;
sum[color]++;
bool flag=0;
for(int i=head[u];i!=-1;i=edge[i].next){
int v=edge[i].to;
if(!dfs(v,1-color)){
return 0;
}
}
return 1;
}
int main(){
memset(head,-1,sizeof(head));
n=read(); m=read();
for(int i=1;i<=m;i++){
int u=read(),v=read();
add(u,v); add(v,u);
}
for(int i=1;i<=n;i++){
if(vis[i]) continue;
if(!vis[i]){
sum[0]=sum[1]=0;
if(!dfs(i,0)){
printf("Impossible\n");
return 0;
}
ans+=min(sum[1],sum[0]);
}
}
printf("%d",ans);
return 0;
}
标签:封锁,int,染色,while,char,阳光,include,P1330,getchar 来源: https://www.cnblogs.com/New-ljx/p/15256597.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。