博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 1098 poi2007 办公楼 bfs+链表
阅读量:6358 次
发布时间:2019-06-23

本文共 1353 字,大约阅读时间需要 4 分钟。

题意很好理解,求给出图反图的联通块个数。

考虑这样一个事情:一个联通块里的点,最多只会被遍历一次,再遍历时没有任何意义

所以用链表来存,每遍历到一个点就将该点删掉

#include
#include
#include
#include
#include
using namespace std;#define N 100005int e=1,head[N],n,m;int nxt[N],ans,pre[N],final[N],tot,q[N];bool bo[N],flag[N];struct edge{ int u,v,next;}ed[4000005];void add(int u,int v){ ed[e].v=v; ed[e].next=head[u]; head[u]=e++;}void del(int x){ nxt[pre[x]]=nxt[x]; pre[nxt[x]]=pre[x];}void bfs(int x){ int h=1,t=1; q[1]=x; while(h<=t){ int now=q[h++]; ans++; for(int i=nxt[0];i<=n;i=nxt[i]) bo[i]=0; for(int i=head[now];i;i=ed[i].next) bo[ed[i].v]=1; for(int i=nxt[0];i<=n;i=nxt[i]){ if(!bo[i]){ del(i); q[++t]=i; } } }}int main(){ int u,v; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d%d",&u,&v); add(u,v); add(v,u); } nxt[0]=1; for(int i=1;i<=n+1;i++){ pre[i]=i-1; nxt[i]=i+1; } tot=0; for(int i=nxt[0];i<=n;i=nxt[0]){ ans=0; del(i); bfs(i); final[++tot]=ans; } sort(final+1,final+tot+1); printf("%d\n",tot); for(int i=1;i<=tot;i++) printf("%d ",final[i]); return 0;}

转载于:https://www.cnblogs.com/Ren-Ivan/p/7746762.html

你可能感兴趣的文章
ThinkPHP 模板变量输出
查看>>
android系统信息(内存、cpu、sd卡、电量、版本)获取
查看>>
HTML5、WebKit与移动应用开发
查看>>
Eclipse Debug Android Native Application
查看>>
java动态代理
查看>>
node.js原型继承
查看>>
揭露让Linux与Windows隔阂消失的奥秘(1)
查看>>
我的友情链接
查看>>
Mysql备份和恢复策略
查看>>
linux17-邮件服务器
查看>>
AS开发JNI步骤
查看>>
Android NDK开发:JNI基础篇
查看>>
使用Maven命令快速建立项目结构
查看>>
二分查找,php
查看>>
python面试题-django相关
查看>>
Python——eventlet.greenthread
查看>>
记大众点评之面试经历
查看>>
第三章:基本概念
查看>>
Jersey+mybatis实现web项目第一篇
查看>>
C++形参中const char * 与 char * 的区别
查看>>