今天下午的二分图染色给我开启新世界的大门啊2333333
这个题要比刚才的关押罪犯简单,只需要染一遍色就能求出答案
#include<iostream> #include<cstring> #include<cstdio> #include<vector> #include<queue> using namespace std; int t,n,m,col[100005],x,y,ans; vector<int>mmp[100005]; queue<int>qwq; bool flag; inline void bfs(int x) { while(!qwq.empty()) qwq.pop(); qwq.push(x),col[x]=1;flag=0;//col[i]1为白,2为黑 int whi=1,bla=0;//计算有多少个黑白点 while(!qwq.empty()) { int qaq=qwq.front(); for(int i=0;i<mmp[qaq].size();i++) { int to=mmp[qaq][i]; if(col[to])//如果发现这个点之前到过 { if(col[to]==col[qaq])//如果这个点和队首一样 { flag=1;return;//答案不可行 } } else { col[to]=3-col[qaq]; if(col[to]==1) whi++; else bla++; qwq.push(to); } } qwq.pop(); } ans+=max(whi,bla);//ans取黑白的最大值,因为假如黑的比白的多,我们把开始变为黑的就能得到白的比黑的多。黑白可以互相转化 } int main() { scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); flag=0,ans=0; for(int i=1;i<=n;i++) col[i]=0,mmp[i].clear(); if(n==0)//连人都没有就别管了23333 { printf("Poor wyh\n");continue; } for(int i=1;i<=m;i++) scanf("%d%d",&x,&y),mmp[x].push_back(y),mmp[y].push_back(x); for(int i=1;i<=n;i++)//如果发现这个点没有被跑过,就进行bfs if(!col[i]) { bfs(i); if(flag)//如果发现答案不可行直接退出 break; } if(flag) printf("Poor wyh\n"); else { if(m==0) { if(ans==1)//如果就一个人,无法满足两个集合 都有人的情况 printf("Poor wyh\n"); else//没有限制条件的情况下肯定能够分到一遍只剩一个人 printf("%d %d\n",ans-1,1); } else//不为零肯定能分成ans n-ans printf("%d %d\n",ans,n-ans); } } }