bzoj 1098 办公楼biu —— 链表+栈
2024-10-21 06:35:26
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1098
首先,没有连边的人一定得在一个连通块里;
先把所有人连成一个链表,然后从第一个人开始,把和它有连边的人都打上标记,没有标记的就加入栈里,并在链表中删除;
只要栈里还有值,就重复这个操作,把必须和栈顶元素在一个连通块的元素也都找出来加入栈,同时 siz++;
因为链表维护,所以遍历人的复杂度总体是 O(n) 的,再加上遍历边的复杂度,算下来是 O(n+m);
关键在于用链表降低遍历人的复杂度!很好的思路。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const xn=1e5+,xm=2e6+;
int n,m,hd[xn],ct,to[xm<<],nxt[xm<<],vis[xn],pr[xn],nt[xn],siz[xn],cnt;
int sta[xn],top;
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return f?ret:-ret;
}
void add(int x,int y){to[++ct]=y; nxt[ct]=hd[x]; hd[x]=ct;}
void del(int x){nt[pr[x]]=nt[x]; pr[nt[x]]=pr[x];}
int main()
{
n=rd(); m=rd();
for(int i=,x,y;i<=m;i++)
{
x=rd(); y=rd();
add(x,y); add(y,x);
}
for(int i=;i<=n;i++)pr[i]=i-,nt[i]=i+;
int i=; nt[]=; pr[n+]=n;
while(nt[]!=n+)
{
i=nt[]; del(i);
for(int j=hd[i];j;j=nxt[j])vis[to[j]]=i;
sta[++top]=i; siz[++cnt]=;
while(top)
{
int x=sta[top]; top--;
for(int k=hd[x];k;k=nxt[k])vis[to[k]]=x; vis[x]=x;
int nww=nt[];
while(nww!=n+)
{
if(vis[nww]!=x)siz[cnt]++,sta[++top]=nww,del(nww);
nww=nt[nww];
}
}
}
printf("%d\n",cnt);
sort(siz+,siz+cnt+);
for(int i=;i<=cnt;i++)printf("%d ",siz[i]);
return ;
}
最新文章
- InventSumDelta表的作用
- js 后台弹窗
- [Java] Tcp/udp 简单通信
- jquery读取本地文件
- 根据input 标签取value属性的值
- 调整Tomcat的并发线程到5000+
- Linux下执行ls命令提示CMake Error错误
- [转]同一台Windows机器中启动多个Memcached服务
- Oracle使用游标查询指定数据表的所有字段名称组合而成的字符串
- c++ 中的智能指针实现
- java框架篇---hibernate(多对多)映射关系
- python--json串相关的loads dumps load dump
- 【Linux】-NO.6.Linux.2.JDK.1.001-【CentOS 7 Install JDK 8u121】-
- Python操作Influxdb数据库
- Nodejs+mysql+Express: 一个简单的博客
- Codeforces 623B Array GCD
- PS快速制作下雪效果
- Bof基础实践
- 分布式文件系统---GlusterF
- .net core +mysqlSugar(最为简单的增删改查)
热门文章
- C# 多线程小试牛刀
- 利用systemtap定位ifconfig dropped数据包的原因
- 【spring boot jpa】hql语句报错 :antlr.NoViableAltException: unexpected token: roleName
- 带您了解Oracle层次查询
- [转]Linux上程序执行的入口--Main
- 函数柯里化 curry
- 【leetcode】 26. Remove Duplicates from Sorted Array
- opencvSGBM半全局立体匹配算法的研究(1)
- 2016-1-8 windows 7下安装mysql及其配置和运用
- Go语言测试代码