luogu1330 *阳光大学 (dfs)

时间:2024-12-09 23:07:38

给每一个联通块黑白染色(一条边两端点不同色),看是否能染

然后选那个出现次数比较少的颜色

 #include<bits/stdc++.h>
#define pa pair<int,int>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=1e4+,maxm=2e5+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int eg[maxm][],egh[maxn],ect;
int N,M;
int flag[maxn]; inline void adeg(int a,int b){
eg[++ect][]=b,eg[ect][]=egh[a],egh[a]=ect;
} void dfs(int x,int y,int &c1,int &c2){
if(y==) c1++;else c2++;
flag[x]=y;
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];
if(flag[b]==flag[x]) c1=-(1e9);
else if(!flag[b]) dfs(b,y==?:,c1,c2);
}
} int main(){
//freopen("","r",stdin);
int i;
N=rd(),M=rd();
for(i=;i<=M;i++){
int a=rd(),b=rd();
adeg(a,b);adeg(b,a);
}
int ans=;
for(i=;i<=N;i++){
int a=,b=;
if(flag[i]) continue;
dfs(i,,a,b);
ans+=min(a,b);
if(ans<) break;
}
if(ans>=) printf("%d\n",ans);
else printf("Impossible");
return ;
}