Description

由于计算机系的同学们都很宅,很多同学虽然身在一个系,但是入学很久还是相互不认识。学生会主席小Y希望举办一次破冰派对,要让同学们多从寝室里走出来参加娱乐活动,也要让尽量多不认识的同学们通过活动相互认识。自然的,如果参加活动的同学互相都不认识,那便是极好的。?
  要办一次成功的派对是很不容易的,不光需要有同学参加,优秀的工作人员也是必不可少的。他们需要为派对的筹办付出很多的努力,因此一个和谐的团队是非常重要的。小Y希望所有工作人员都是相互认识的。
  计算机系一共有N个同学,所有同学从1到N编号。有M对同学相互认识,而其余的同学相互不认识。
  小Y希望从中选出一些工作人员组成工作团队,让这个工作团队负责活动的组织,而其余的所有非工作人员,就自然都成为了活动的参与者。小Y要求:
  1、工作团队的成员必须相互认识;   2、参与活动的同学必须相互不认识;   3、至少有一个同学参与活动,也至少有一个同学是工作人员。
  小Y想知道,一共有多少种工作团队的选择方案呢?

Input

第一行读入一个整数T,表示测试数据的组数。接下来T组数据,每组数据格式如下:   第一行包含两个整数N和M。
  接下来M行,第i行包含两个不同的,在1到N之间的整数xi,yi,表示编号为xi和yi的同学相互认识。
  输入数据保证,在每一组测试数据中,任意两个同学之间的朋友关系都不会被列出两次。

Output

对于每一组测试数据输出一行一个整数,表示可行的方案总数,模1000003的余数。

Sample Input

2

1 0

4 4

1 2

1 3

2 3

3 4

Sample Output

0

3

HINT

对于100%的数据满足1 ≤ N ≤ 1000,0 ≤ M ≤ N^2,1 ≤ T ≤ 6。

题解

这不是一个搜索题
题目让你把他分成两个块,满足一个块之间两两有边而另一个块之间两两无边,问方案数
如果我们能弄出来一个合法解,可以知道,剩余的解只有可能有三种情况
1:在未选择的图选择一个加入
2:在选择的图中选择一个拿出
3:在未选择的图中选择一个拿入并在选择的图中选择一个拿出
证明是显然的
然后我们考虑如何弄出一个合法解
把点按度数从大到小排序,这里需要一个结论就是,如果一个度数大的点没有在选择的图中,那么剩余度数比他小的点全部都不能在选择的图中
因为一个点如果没选,那么与之相连的全部都要被选中,又知道剩余加入的点一定要至少与这些点有边,但是他们的度数比我当前这个度数小,所以不可能再被加入了
那么从大到小加入点直到做出一个合法的方案,剩余按上面调整即可
复杂度 O ( m + n l o g n ) O(m+nlogn) O(m+nlogn)
这个题其实允许了 n 2 n^2 n2,那么其实还可以 2 − s a t 2-sat 2−sat直接 n 2 n^2 n2暴力建边求一个合法解

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<ctime>
#include<map>
#include<bitset>
#include<set>
#define LL long long
#define mp(x,y) make_pair(x,y)
#define pll pair<long long,long long>
#define pii pair<int,int>
using namespace std;
inline int read()
{int f=1,x=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int stack[20];
inline void write(LL x)
{if(x<0){putchar('-');x=-x;}if(!x){putchar('0');return;}int top=0;while(x)stack[++top]=x%10,x/=10;while(top)putchar(stack[top--]+'0');
}
inline void pr1(int x){write(x);putchar(' ');}
inline void pr2(LL x){write(x);putchar('\n');}
const int MAXN=1005;
struct edge{int x,y,next;}a[MAXN*MAXN*2];int len,last[MAXN];
void ins(int x,int y){len++;a[len].x=x;a[len].y=y;a[len].next=last[x];last[x]=len;}
int n,m,cal[MAXN],du[MAXN],fac[MAXN];
bool cmp(int n1,int n2){return du[n1]>du[n2];}
vector<int> A,B;
bool in[MAXN];
int vi[MAXN],tim;
int main()
{//  freopen("a.in","r",stdin);int CASE=read();while(CASE--){len=0;memset(last,0,sizeof(last));memset(du,0,sizeof(du));A.clear();memset(in,false,sizeof(in));memset(vi,0,sizeof(vi));tim=0;n=read();m=read();for(int i=1;i<=m;i++){int x=read(),y=read();ins(x,y);ins(y,x);du[x]++;du[y]++;}for(int i=1;i<=n;i++)fac[i]=i;int lin=m;sort(fac+1,fac+1+n,cmp);int cnt=0;bool ok=true;for(int i=1;i<=n;i++){int sum=0;for(int k=last[fac[i]];k;k=a[k].next){int y=a[k].y;if(!in[y])m--;else sum++;}if(sum==cnt)A.push_back(fac[i]),in[fac[i]]=true,cnt++;else if(m)break;}if(m){puts("0");continue;}LL as=0,plan=1;for(int i=1;i<=n;i++)if(in[i])as+=cal[i];LL total=as;if(cnt==n)plan=0;//  if(!lin)as=max(as,0LL),plan++;for(int i=1;i<=n;i++)if(!in[i]){int sum=0;tim++;for(int k=last[i];k;k=a[k].next){int y=a[k].y;if(in[y])sum++,vi[y]=tim;}if(sum==cnt-1){int u;for(int j=0;j<A.size();j++)if(vi[A[j]]!=tim){u=A[j];break;}as=max(as,total-cal[u]+cal[i]);plan++;}else if(sum==cnt&&cnt!=n-1)as=max(as,total+cal[i]),plan++;}for(int i=1;i<=n;i++)if(in[i]){bool tf=true;for(int k=last[i];k;k=a[k].next){int y=a[k].y;if(!in[y]){tf=false;break;}}if(tf&&cnt!=1)as=max(as,total-cal[i]),plan++;}//  if(CASE&1)pr2(plan%1000003);}
//  else pr2(as);return 0;
}

[bzoj3579][乱搞]破冰派对相关推荐

  1. AcWing 397. 逃不掉的路(边双连通分量缩点成树 + 树链剖分乱搞)

    整理的算法模板合集: ACM模板 我们知道在同一个边双连通分量中的点没有必经边(因为至少有两条分离的路径). 所以我们直接tarjan求出桥后缩点,然后求一下树上两点间的距离即可. 那么如何求树上两点 ...

  2. bzoj 1050: [HAOI2006]旅行comf(codevs.cn 1001 舒适的路线) 快排+并查集乱搞

    没用的话:好像很久没发博客了,主要是懒太蒟找不到水题.我绝对没弃坑...^_^ 还用些话:本文为博主原创文章,若转载请注明原网址和作者. 进入正题: 先pa网址: bzoj :http://www.l ...

  3. BZOJ-1800 飞行棋 数学+乱搞

    这道题感觉就是乱搞,O(n^4)都毫无问题 1800: [Ahoi2009]fly 飞行棋 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1172 So ...

  4. 【BZOJ-3578】GTY的人类基因组计划2 set + map + Hash 乱搞

    3578: GTY的人类基因组计划2 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 367  Solved: 159 [Submit][Status ...

  5. BZOJ4401:块的计数(乱搞)

    Description 小Y最近从同学那里听说了一个十分牛B的高级数据结构--块状树.听说这种数据结构能在sqrt(N)的时间内维护树上的各种信息,十分的高效.当然,无聊的小Y对这种事情毫无兴趣,只是 ...

  6. Luogu3732 [HAOI2017] 供给侧改革 【后缀数组】【线段树】【乱搞】

    题目分析: 这道题我是乱搞的,因为他说$01$串是随机的. 那么我们可以猜测能够让LCP变大的地方很少.求出后缀数组之后可能让LCP变大的地方就等价于从大到小往height里动态加点同时维护这个点左右 ...

  7. 【uoj#209】[UER #6]票数统计 组合数+乱搞

    题目描述 一个长度为 $n$ 的序列,每个位置为 $0$ 或 $1$ 两种.现在给出 $m$ 个限制条件,第 $i$ 个限制条件给出 $x_i$ .$y_i$ ,要求至少满足以下两个条件之一: 序列的 ...

  8. 【NOI2018】你的名字【后缀自动机】【可持久化线段树合并】【乱搞】

    题意:给一个串 SSS,qqq 次询问,每次给定串 TTT 和 l,rl,rl,r ,求有多少个本质不同的串是 TTT 的子串而不是 Sl-rS_{l\dots r}Sl-r​ 的子串. ∣S∣≤5× ...

  9. codeforces1496 D. Let‘s Go Hiking(乱搞+讨论)

    这题我tm服了,考试中途肯定添加了一组数据,提交完A了之后,还有20min结束,感觉写不了下一个题了,就下班了,谁知道它有填了一组测试数据把我的乱搞给卡过去了,我又被fst了???然后我有乱改了一下又 ...

最新文章

  1. java icomparer_集合数据处理(C#、JavaScript 和 Java)
  2. 数据库能承受多少并发量_在工业应用中,高温套管能承受多少度?
  3. javasript --- 一个日期规范(x秒前,x分前...)
  4. Teams Bot开发系列:Activity和Turn
  5. android 中resources管理
  6. 递推——覆盖墙壁(洛谷 P1990)
  7. Go语言的异常处理之errors,panic, recover
  8. java 元数据 注解_Java元数据总结:Java注释的使用和定义
  9. Pandas系列(一)数据读取、数据结构Dataframe和Series
  10. iOS开发之$ pod setup时,CocoaPods报CocoaPods was not able to update the `master` repo.
  11. [Istioc]Istio部署sock-shop时rabbitmq出现CrashLoopBackOff
  12. 怎么对神经网络重新训练,神经网络重建
  13. ERPS(Ethernet Ring Protection Switching):以太网多环保护技术
  14. CMD 下载并运行软件 Cmd Bat Powershell
  15. matlab车牌自动定位,超级实用的车牌定位matlab程序
  16. 正则(数字或者以英文逗号隔开的数字字符串)
  17. C语言字符数组的定义与初始化
  18. spark封神之路(7)-RDD算子详解第一部分
  19. R语言数据类型基础1 数值型、逻辑型与文本型
  20. 健壮I/O读写函数——RIO包

热门文章

  1. “泰迪杯”挑战赛 - 基于Java的面向网络舆情的关联度分析(附算法代码)
  2. 小成本对付宽带我世界实现有线/无线同时上网
  3. python 实现SMTP发送邮件(四)-添加附件
  4. iOS Umeng分享/第三方授权登录
  5. 易语言dnf自动刷图教程
  6. 基础架构实验室-正式开源物联网平台
  7. 最小二乘法和最小二乘估计和M估计式什么关系?
  8. 软件产品登记-全攻略
  9. idea突然不能粘贴外面的东西
  10. 认知神经科学--细胞机制与认知