题目:https://www.luogu.org/problemnew/show/P5061

首先,“配合默契”就是连边的意思;

但发现答案不好统计,因为有连边的两个点可以分在一组,也可以不分在一组;

于是正难则反,因为没有连边的两个点一定不在一组,所以连成补图,二分图染色;

如果染色出现矛盾,就是无解——第三问的意思是什么?无解的时候应该也只是某几个连通块染色不合法,在其它连通块中也有配合默契的一对人可以分在同一组啊,为什么输出 m ?

然后背包一下,得到可以选择的人数,直接一个一个加到答案即可,差值最小就是人数最接近 n/2;

然后配合默契的一对人不能在一组的方案数也直接 n^2 统计在一个连通块没有连边但染色不同的点对即可;

虽然出题人的正解并不是二分图,但不太懂那个正解...

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const xn=,mod=1e9+;
int n,m,col[xn],f[xn],cnt,s[xn][],in[xn],tot;
bool sid[xn][xn],cant[xn];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
ll pw(ll a,int b)
{
ll ret=;
for(;b;b>>=,a=(a*a)%mod)if(b&)ret=(ret*a)%mod;
return ret;
}
int upt(int x){while(x>=mod)x-=mod; while(x<)x+=mod; return x;}
bool dfs(int x,int cr,int nw)
{
col[x]=cr; s[nw][cr]++; in[x]=nw;
for(int u=;u<=n;u++)
{
if(sid[x][u]||x==u)continue;
if(!col[u])dfs(u,-cr,nw);
else if(col[u]==col[x])return ;
}
return ;
}
int main()
{
n=rd(); m=rd();
for(int i=,x,y;i<=m;i++)x=rd(),y=rd(),sid[x][y]=sid[y][x]=;
bool flag=;
for(int i=;i<=n;i++)
if(!col[i])
{
bool fl=dfs(i,,++cnt);
if(!fl)flag=,cant[cnt]=;
}
if(flag){puts("-1"); printf("%d\n",m); return ;}//m?!
else
{
f[]=;
for(int i=;i<=cnt;i++)
for(int j=n;j>=;j--)//--!
{
if(j>=s[i][])f[j]|=f[j-s[i][]];
if(j>=s[i][])f[j]|=f[j-s[i][]];
}
int ans=,num;
for(int i=;i<=n/;i++)
{
if(!f[i]||!f[n-i])continue;//f[0]=1
ans++; num=i;
}
printf("%d %d\n",ans,upt(pw(,n-num)-pw(,num)));
}
int sum=;
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
if(in[i]==in[j]&&sid[i][j]&&(cant[in[i]]||col[i]!=col[j]))sum++;
printf("%d\n",sum);
return ;
}

最新文章

  1. mdadm设定RAID磁盘阵列,且当分区故障后如何重建
  2. shell 指定范围产生随机数
  3. 如何清除WebBrowser的Cookies
  4. 作业八—Alpha阶段项目总结
  5. hdu4734 F(x)
  6. 新浪微博OAuth2.0的用法
  7. ContentProvider往通讯录添加联系人和获取联系人
  8. git服务器搭建-new
  9. 从敏捷开发到小团队SVN
  10. php中文字符串反转
  11. Linux-手动释放缓存(Buffer、Cache)
  12. Node.js 回调函数
  13. 【SqlServer系列】浅谈SQL Server事务与锁(上篇)
  14. typeof与instanceof的区别
  15. Ubuntu 14.10下基于Nginx搭建mp4/flv流媒体服务器(可随意拖动)并支持RTMP/HLS协议(含转码工具)
  16. Asp.Net Core get client IP
  17. phpcms的一些问题 乱码,安装
  18. 寻找 IBatisNet 批量插入(批量复制) 的心路历程
  19. java基础之HashSet如何保证对象的唯一性
  20. c# 知识学习

热门文章

  1. ubuntu16.04--在标题栏显示网速
  2. ui-router $transitions 用法
  3. 基于RedHat发行的Apache Tomcat本地提权漏洞
  4. excel表格定义导入到powerdesigner脚本
  5. ssh无密码登陆屌丝指南
  6. PHP进阶知识
  7. Hadoop-2.2.0中文文档—— MapReduce 下一代--容量调度器
  8. LeetCode:有效的括号【20】
  9. poj 3268 Silver Cow Party (最短路算法的变换使用 【有向图的最短路应用】 )
  10. JNDI数据源配置