给每一个联通块黑白染色(一条边两端点不同色),看是否能染
然后选那个出现次数比较少的颜色
1 #include<bits/stdc++.h> 2 #define pa pair<int,int> 3 #define CLR(a,x) memset(a,x,sizeof(a)) 4 using namespace std; 5 typedef long long ll; 6 const int maxn=1e4+10,maxm=2e5+10; 7 8 inline ll rd(){ 9 ll x=0;char c=getchar();int neg=1; 10 while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();} 11 while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar(); 12 return x*neg; 13 } 14 15 int eg[maxm][2],egh[maxn],ect; 16 int N,M; 17 int flag[maxn]; 18 19 inline void adeg(int a,int b){ 20 eg[++ect][0]=b,eg[ect][1]=egh[a],egh[a]=ect; 21 } 22 23 void dfs(int x,int y,int &c1,int &c2){ 24 if(y==1) c1++;else c2++; 25 flag[x]=y; 26 for(int i=egh[x];i;i=eg[i][1]){ 27 int b=eg[i][0]; 28 if(flag[b]==flag[x]) c1=-(1e9); 29 else if(!flag[b]) dfs(b,y==1?2:1,c1,c2); 30 } 31 } 32 33 int main(){ 34 //freopen("","r",stdin); 35 int i; 36 N=rd(),M=rd(); 37 for(i=1;i<=M;i++){ 38 int a=rd(),b=rd(); 39 adeg(a,b);adeg(b,a); 40 } 41 int ans=0; 42 for(i=1;i<=N;i++){ 43 int a=0,b=0; 44 if(flag[i]) continue; 45 dfs(i,1,a,b); 46 ans+=min(a,b); 47 if(ans<0) break; 48 } 49 if(ans>=0) printf("%d ",ans); 50 else printf("Impossible"); 51 return 0; 52 }