题目描述

FGD开办了一家电话公司。他雇用了N个职员,给了每个职员一部手机。每个职员的手机里都存储有一些同事的电话号码。由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD决定将公司迁至一些新的办公楼。FGD希望职员被安置在尽量多的办公楼当中,这样对于每个职员来说都会有一个相对更好的工作环境。但是,为了联系方便起见,如果两个职员被安置在两个不同的办公楼之内,他们必须拥有彼此的电话号码。

输入

第一行包含两个整数N(2<=N<=100000)和M(1<=M<=2000000)。职员被依次编号为1,2,……,N.以下M行,每行包含两个正数A和B(1<=A<b<=n),表示职员a和b拥有彼此的电话号码),li <= 1000

输出

包含两行。第一行包含一个数S,表示FGD最多可以将职员安置进的办公楼数。第二行包含S个从小到大排列的数,每个数后面接一个空格,表示每个办公楼里安排的职员数。

样例输入

7 16
1 3
1 4
1 5
2 3
3 4
4 5
4 7
4 6
5 6
6 7
2 4
2 7
2 5
3 5
3 7
1 7

样例输出

3
1 2 4

提示

FGD可以将职员4安排进一号办公楼,职员5和职员7安排进2号办公楼,其他人进3号办公楼。

题解

    考试时打的是并查集,今天上午仿佛中了并查集的毒,哪哪都打的并查集;骗了60分,剩下的是TLE。其实并查集的思路相当科学,只不过是会T掉大数据= =。很明显是要构造反图,但大概是思路不够宽的原因没有刻意想这事,不过也确实造不出来。我的做法是很暴力地枚举不连通的点,然后加权并查集统计各个集合中的点数,O(n^2)大概能过4*10^4以下的点。
正解只不过是用了链表优化上述思路,而把并查集统计换成了BFS。原来一直以为链表就是邻接表,今天才知道好像只有名字像而已吧。链表用一个nxt[sj]和一个pre[sj]双向连接,删除操作是
nxt[pre[i]]=nxt[i]; pre[nxt[i]]=pre[i];
这样每枚举一个点就把它反图所在连通块全部BFS完(用队列,不知道为什么cena会栈溢出,内网上没事),顺便把所有入队点都从链表里删掉,下一次只从链表中剩下的元素里枚举,时间优化不是一点半点。ad学长问大家一个算法有没有学懂都是问时间复杂度,可见这确实能衡量对算法的理解程度。我至今算时间复杂度也不过是数数for循环,今天看着学长分析高级算法里的复杂度神乎其技。说来很惭愧原来学的那些数学知识早就忘干净了,欧拉函数扩展gcd只能说一句“会过”,怎么能行呢。今天的课也很需要消化,不练题肯定不行。在教室就是学习数学的好时间,悟已往之不谏,知来者之可追。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int nj=,mj=;
int n,m,a1,a2,ans[nj],h[nj],e,jk,temp,nxt[nj],pre[nj];
bool vi[nj],bg[nj];
struct B
{
int v,ne;
}b[mj*];
queue<int> q;
void add(int x,int y)
{
b[e].v=y;
b[e].ne=h[x];
h[x]=e++;
}
void bfs(int x)
{
memset(vi,,sizeof(vi));
vi[x]=;
for(int i=h[x];i!=-;i=b[i].ne)
vi[b[i].v]=;
for(int i=;i<=n;i=nxt[i])
if(!vi[i]&&!bg[i])
{
q.push(i);
nxt[pre[i]]=nxt[i];
pre[nxt[i]]=pre[i];
}
while(!q.empty())
{
temp=q.front();
q.pop();
bg[temp]=;
bfs(temp);
ans[jk]++;
}
}
int main()
{
//freopen("t3.txt","r",stdin);
//freopen("biu.in","r",stdin);
//freopen("biu.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
pre[i]=i-;
nxt[i]=i+;
}
memset(h,-,sizeof(h));
for(int i=;i<=m;i++)
{
scanf("%d%d",&a1,&a2);
add(a1,a2);
add(a2,a1);
}
for(int i=;i<=n;i=nxt[i])
{
jk++;
bg[i]=;
ans[jk]++;
bfs(i);
nxt[pre[i]]=nxt[i];
pre[nxt[i]]=pre[i];
}
printf("%d\n",jk);
sort(ans+,ans+jk+,less<int>());
for(int i=;i<=jk;i++)
printf("%d ",ans[i]);
//while(1);
return ;
}
 

办公楼[POI2007]的更多相关文章

  1. BZOJ1098: [POI2007]办公楼biu

    从问题可以看出是求补图的连通块及点数 但补图太大.所以考虑缩小规模. 当一个点归属于一个连通块后,它以后就不需要了.所以可以用链表,删去这个点,也就减小了规模. 一个点开始bfs,每个点只会进队一次, ...

  2. BZOJ_1098_[POI2007]办公楼biu_链表优化BFS

    BZOJ_1098_[POI2007]办公楼biu_链表优化BFS Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的 电话号 ...

  3. bzoj 1098 [POI2007]办公楼biu bfs+补图+双向链表

    [POI2007]办公楼biu Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1543  Solved: 743[Submit][Status][Di ...

  4. 5098: [BZOJ1098][POI2007]办公楼biu

    5098: [BZOJ1098][POI2007]办公楼biu 没有数据结构就很棒 一个看上去非常玄学的代码 const int N=1e5+10,M=2e6+10; int n,m; int fa[ ...

  5. 【BZOJ】1098: [POI2007]办公楼biu(补图+bfs+链表)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1098 显然答案是补图连通块..... 想到用并查集...可是连补图的边都已经...n^2了...怎么 ...

  6. 【链表】Bzoj1098[POI2007]办公楼biu

    Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD决 ...

  7. 【刷题】BZOJ 1098 [POI2007]办公楼biu

    Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的 电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD ...

  8. BZOJ1098 POI2007 办公楼biu 【链表+bfs】

    Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD决 ...

  9. bzoj 1098 [POI2007] 办公楼 biu

    # 解题思路 画画图可以发现,只要是两个点之间没有相互连边,那么就必须将这两个人安排到同一个办公楼内,如图所示: 那,我们可以建立补图,就是先建一张完全图,然后把题目中给出的边都删掉,这就是一张补图, ...

随机推荐

  1. html中p标签行间距的问题

    使用CSS行高样式line-height可以设置调整p行间距,但是同时会影响每行文字间的上下间距,所以使用line-height虽然可以用来设置html p 行距离间隔,但是不是很实用,一般line- ...

  2. 数据结构与算法(c++)——查找二叉树与中序遍历

    查找树ADT--查找二叉树 定义:对于树中的每个节点X,它的左子树中的所有项的值小于X中的项,而它的右子树中所有项的值大于X中的项. 现在给出字段和方法定义(BinarySearchTree.h) # ...

  3. 详解 try-with-resource

    [TOC] Oracle官方文档: http://docs.oracle.com/javase/7/docs/technotes/guides/language/try-with-resources. ...

  4. 关于MATLAB处理大数据坐标文件2017622

    今天新提交了一次数据,总量达到10337个,本以为成绩会突飞猛进,没想到还是不如从前 但是已经找到人工鼠标轨迹的程序,有待完善,接下来兵分四路:找特征.决策树.完善人工轨迹程序,使其可以将生成的数据自 ...

  5. 关于MATLAB处理大数据坐标文件2017530

    今天使用了所有特征并且用SVM测试数据 理由:SVM可以使用特征将测试集划分区域,比较单调.死板 结果:成绩很不理想,无疑又一次说明随机森林更适合大数据处理 第二次提交数据 用MATLAB运行11次运 ...

  6. 自动安装lnmp

    注:需先上传各安装包至服务器.#!/bin/bash #! auto install lnmp #! 安装依赖环境 yum -y groupinstall "X Software Devel ...

  7. js函数一些小的知识点

    var scope="123"; function aa(){ console.log(scope);//undefind var scope="234"; c ...

  8. iOS 转场动画探究(二)

    这篇文章是接着第一篇写的,要是有同行刚看到的话建议从前面第一篇看,这是第一篇的地址:iOS 转场动画探究(一) 接着上一篇写的内容: 上一篇iOS 转场动画探究(一)我们说到了转场要素的第四点,把那个 ...

  9. 【Android Developers Training】 76. 用Wi-Fi创建P2P连接

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  10. 第一章(认识jQuery)

    1.3.2编写简单的jQuery代码 ①$是jQuery的简写 ②$("#foo") = $("#foo") ③$.ajax  =  jQuery.ajax ④ ...