【题意分析】

  给你一张无向图,求其补图的联通块数及各个联通块大小。

【解题思路】

  暴搜!

  然而n2会T怎么办?

  仔细观察发现m远小于n2,也就是说这是一张极其稠密的补图。

  这时就要用到黑科技了:floodfill

  用邻接表维护原图的边,用链表维护当前剩余可选点,每次从队首出发从链表里找补图的边,把这些边对应的点入队并从链表里删去。

  这样,我们构造一种最坏的情况来卡这个算法:

  假设前m/n个点每个点都只和一个点不相连,这样对于每个点都要遍历链表中的所有点,此时复杂度是O((m/n)*n)=O(m)。

  因为前面已经把m条边都分配完了,接下来的第一个点就O(n)把链表清空了。之后的点全都是O(1)发现链表已被清空。

  这样总复杂度就是O(m+n)了。

【参考代码】

 #include <bits/stdc++.h>
#define range(i,c,o) for(register int i=(c);i<(o);++i)
#define dange(i,c,o) for(register int i=(c);i>(o);--i)
#define forin(i,t,p) for(t:: iterator i=p. begin();i!=p. end();++i)
#define dorin(i,t,p) for(t::reverse_iterator i=p.rbegin();i!=p.rend();++i)
using namespace std; #define __debug
#ifdef __debug
#define Function(type) type
#define Procedure void
#else
#define Function(type) __attribute__((optimize("-O2"))) inline type
#define Procedure __attribute__((optimize("-O2"))) inline void
#endif #ifdef __int128_t
typedef __int128_t integer;
#else
typedef long long integer;
#endif //quick_io {
Function(integer) getint()
{
char c=getchar(); for(;!isdigit(c)&&c!='-';c=getchar());
short s=; for(;c=='-';c=getchar()) s*=-; integer r=;
for(;isdigit(c);c=getchar()) (r*=)+=c-''; return s*r;
}
//} quick_io static int n=getint(); //list {
int suc[],pre[];
Procedure clear()
{
range(i,,n+) suc[i]=i+,pre[i]=i-;
suc[]=,pre[n+]=n;
}
Procedure erase(const int&x)
{
pre[suc[x]]=pre[x],suc[pre[x]]=suc[x];
}
//} list bool tag[]={},vis[]={};
vector<int> edg[]; queue<int> que;
Function(int) floodfill(const int&rt)
{
int ret=; erase(rt);
for(que.push(rt);!que.empty();que.pop())
{
int fr=que.front(); vis[fr]=,++ret;
forin(i,vector<int>,edg[fr]) tag[*i]=;
for(int i=suc[];i<=n;i=suc[i])
{
if(!tag[i]) erase(i),que.push(i);
}
forin(i,vector<int>,edg[fr]) tag[*i]=;
}
return ret;
} int rec[];
int main()
{
for(int m=getint();m--;)
{
int u=getint(),v=getint();
edg[u].push_back(v),edg[v].push_back(u);
}
clear(); int cnt=;
range(i,,n+) if(!vis[i]) rec[cnt++]=floodfill(i);
sort(rec,rec+cnt),printf("%d\n",cnt);
range(i,,cnt) printf("%d ",rec[i]);
return putchar('\n'),;
}

bzoj1098题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. 【Zookeekper】分布锁Curator

    有序节点:假如当前有一个父节点为/lock,我们可以在这个父节点下面创建子节点:zookeeper提供了一个可选的有序特性,例如我们可以创建子节点“/lock/node-”并且指明有序,那么zooke ...

  2. vue基础七

    事件处理器 1.监听事件 可以用 v-on 指令监听 DOM 事件来触发一些 JavaScript 代码. <div id="example-1"> <butto ...

  3. [NOIP模拟26]题解

    今天的考试题改自闭了……所以滚来写陈年题解. A.*****贪婪***** RT,出题人告诉我们这题要贪心. 最优的策略一定是拖到必须断的时候再断开(虽然并不知道为什么). 如果一段序列满足题目中的性 ...

  4. 转:Linux设备树(Device Tree)机制

    目录 1. 设备树(Device  Tree)基本概念及作用 2. 设备树的组成和使用 2.1. DTS和DTSI 2.2. DTC 2.3. DTB 2.4. Bootloader 3. 设备树中d ...

  5. (57)C# frame4 调用frame2

    http://msdn.microsoft.com/zh-cn/library/bbx34a2h.aspx https://www.cnblogs.com/weixing/archive/2012/0 ...

  6. 64、通过PickListValuesUtil,Schema查看下拉列表中的值

    public class PickListValuesUtil { public static Map<String,Object> getPicklistValues(String sO ...

  7. 自定义npm命令行工具,并发布到www.npmjs.com

    1.自定义一个npm脚本 - 1.新建一个项目(在任何路径都可以); - 2.使用`npm init -y`初始化项目 - 3.新建一个index.js文件,在文件的第一行添加 `#!/usr/bin ...

  8. 02 java语言基础

    常量:字面值常量(字符串,字符,整数,小数,布尔,null),自定义常量,''这个不是字符常量,""这个是字符串常量 进制: 02.01_Java语言基础(常量的概述和使用) A: ...

  9. NtCallbackReturn是否导致了用户态栈的不平衡

    0:000> u ntdll!KiFastSystemCall ntdll!KiFastSystemCall: 7c92eb8b 8bd4 mov edx,esp 7c92eb8d 0f34 s ...

  10. 为什么重写equals还要重写hashcode

    参考回答: HashMap中,如果要比较key是否相等,要同时使用这两个函数!因为自定义的类的hashcode()方法继承于Object类,其hashcode码为默认的内存地址,这样即便有相同含义的两 ...