考虑对于第$i$层$x$与第$i+1$层所对应的点$y$,点$p$在前$i$层中当且仅当$p$到$x$比$p$到$y$距离小

由此,考虑枚举第一层的一个点以及对应到第二层的边,通过bfs就可以确定第一层的点

接下来,标记第一层的点后,第一层的点剩下到未标记的点即为第二层的点,以此类推,就可以$o(m)$的确定所有点(注意还要判断)

注意到度数最小的点,必然出现在第一层或最后一层(否则第一层或最后一层对应的点度数少1),根据对称性,不难证明对于任意一个度数最少的点,存在一组方案满足其在第一层中

同时,度数最小的点的度数不超过$\min(\frac{m}{n},n)$,即$o(\sqrt{m})$,总复杂度为$o(m\sqrt{m})$

  1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 struct ji{
5 int nex,to;
6 }edge[N<<2];
7 queue<int>q;
8 vector<int>v[N],ansv[N];
9 int E,n,m,x,y,ans,head[N],r[N],d[N],d0[N],vis[N],pos[N];
10 void add(int x,int y){
11 edge[E].nex=head[x];
12 edge[E].to=y;
13 head[x]=E++;
14 }
15 void bfs(int k){
16 memset(d,0x3f,sizeof(d));
17 d[k]=0;
18 q.push(k);
19 while (!q.empty()){
20 int k=q.front();
21 q.pop();
22 for(int i=head[k];i!=-1;i=edge[i].nex)
23 if (d[edge[i].to]==0x3f3f3f3f){
24 d[edge[i].to]=d[k]+1;
25 q.push(edge[i].to);
26 }
27 }
28 }
29 bool check(){
30 if (n%v[1].size())return 0;
31 if ((m-(n-v[1].size()))%(n/v[1].size()))return 0;
32 memset(vis,0,sizeof(vis));
33 for(int i=0;i<v[1].size();i++)pos[v[1][i]]=i;
34 for(int i=1;i<n/v[1].size();i++){
35 for(int j=0;j<v[i].size();j++)vis[v[i][j]]=1;
36 v[i+1].clear();
37 for(int j=0;j<v[i].size();j++){
38 int to=0;
39 for(int k=head[v[i][j]];k!=-1;k=edge[k].nex)
40 if (!vis[edge[k].to]){
41 if (to)return 0;
42 to=edge[k].to;
43 }
44 v[i+1].push_back(to);
45 pos[to]=j;
46 }
47 }
48 int sum=2*(m-(n-v[1].size()))/(n/v[1].size());
49 for(int i=0;i<v[1].size();i++)
50 for(int j=head[v[1][i]];j!=-1;j=edge[j].nex)
51 if (pos[edge[j].to]!=i)sum--;
52 if (sum)return 0;
53 for(int i=0;i<v[1].size();i++){
54 for(int j=0;j<v[1].size();j++)vis[j]=0;
55 for(int j=head[v[1][i]];j!=-1;j=edge[j].nex)
56 if (pos[edge[j].to]!=i)vis[pos[edge[j].to]]=1;
57 for(int j=2;j<=n/v[1].size();j++){
58 sum=0;
59 for(int k=head[v[j][i]];k!=-1;k=edge[k].nex)
60 if (pos[edge[k].to]==i)sum++;
61 else{
62 if (!vis[pos[edge[k].to]])return 0;
63 }
64 if (sum!=2-(j==n/v[1].size()))return 0;
65 }
66 }
67 return 1;
68 }
69 int main(){
70 scanf("%d%d",&n,&m);
71 memset(head,-1,sizeof(head));
72 for(int i=1;i<=m;i++){
73 scanf("%d%d",&x,&y);
74 add(x,y);
75 add(y,x);
76 r[x]++,r[y]++;
77 }
78 r[0]=r[1];
79 for(int i=1;i<=n;i++)r[0]=min(r[0],r[i]);
80 for(int i=1;i<=n;i++)
81 if (r[i]==r[0])x=i;
82 bfs(x);
83 memcpy(d0,d,sizeof(d));
84 for(int i=head[x];i!=-1;i=edge[i].nex){
85 y=edge[i].to;
86 bfs(y);
87 v[1].clear();
88 for(int j=1;j<=n;j++)
89 if (d0[j]<d[j])v[1].push_back(j);
90 if ((check())&&(n/v[1].size()>ans)){
91 ans=n/v[1].size();
92 for(int j=1;j<=ans;j++)ansv[j]=v[j];
93 }
94 }
95 if (!ans){
96 printf("1 %d\n",n);
97 for(int i=1;i<=n;i++)printf("%d ",i);
98 return 0;
99 }
100 printf("%d %d\n",ans,n/ans);
101 for(int i=1;i<=ans;i++){
102 for(int j=0;j<ansv[i].size();j++)printf("%d ",ansv[i][j]);
103 printf("\n");
104 }
105 }

[gym102798F]Skeleton Dynamization的更多相关文章

  1. [dpdk] 熟悉SDK与初步使用 (二)(skeleton源码分析)

    接续前节:[dpdk] 熟悉SDK与初步使用 (一)(qemu搭建实验环境) 程序逻辑: 运行参数: 关键API: 入口函数: int rte_eal_init(int argc, char **ar ...

  2. Getting started: A skeleton application

    Getting started: A skeleton application In order to build our application, we will start with theZen ...

  3. [PWA] 11. Serve skeleton cache for root

    Intead of cache the root floder, we want to cache skeleton instead. self.addEventListener('install', ...

  4. 使用 Skeleton Screen 提升用户感知体验

    1024程序猿节"愿世界和平,没有bug",腾讯云社区向改变世界的程序猿致敬! 作者:陈纬杰 一直以来,无论是web还是iOS.android的应用中,为了提升应用的加载等待这段时 ...

  5. Skeleton Screen -- 骨架屏--应用

    案例:使用 现已经在支付的项目使用 用户体验一直是前端开发需要考虑的重要部分,在数据请求时常见到锁屏的loading动画,而现在越来越多的产品倾向于使用Skeleton Screen Loading( ...

  6. Why is it called “armature” instead of “skeleton”? or perhaps “rig”?

    Great question, I’ve always assumed armature/skeleton to be the same thing, here’s a quote from an a ...

  7. Spine Skeleton Animation(2D骨骼动画)

    骨骼动画 首先我们来看到底什么是骨骼动画: 在早期的机器上,渲染本身已经占用了很多CPU资源,因此,对于渲染,往往采取的是一种空间换时间的策略,以避免在模型的渲染中继续加重CPU的负担.帧动画模型在这 ...

  8. images & Skeleton

    images & Skeleton image placeholder & loading ... skeleton.css https://github.com/dhg/Skelet ...

  9. DPDK skeleton basicfwd 源码阅读

    学习这个例子用于理解单纯的 dpdk 转发过程,L2 和 L3 的转发是基于此:在rte_eth_rx_burst()收包后进行解包,提取 mac.ip 等信息然后在转发到输出网卡. 如果要写出自己的 ...

随机推荐

  1. mysql 建表后 重新构建 自增字段 (保留 原有字段结构)

    添加字段 1.去除原id的自增功能:ALTER TABLE A_A MODIFY COLUMN id int(10) NOT NULL FIRST ; 2.添加名称为cstId,类型为bigint的字 ...

  2. 浅尝装饰器和AOP

    [写在前面] 参考文章:https://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html[从简单的例子入手进行讲解,由浅入深,很到位] 装饰器部 ...

  3. cookie和session和localStorage的区别

    这三个都是保存在浏览器端,而且都是同源的. Session仅在当前浏览器窗口关闭有效,不能持久保存 Localstorage始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据 Cookie只在设置 ...

  4. 简明教程 | Docker篇 · 其二:Dockerfile的编写

    Dockerfile是什么 一个包含用于组合 image 的命令的文本文件,docker 通过 dockerfile 和构建环境的上下文来构建 image . 编写Dockerfile FROM 首先 ...

  5. VS2019、Qt5.12及QGis3.16开发常见问题汇总

    在C++.Qt软件开发过程中,常常遇到一些编译错误或警告:本文将VS2019.Qt5.12.10和QGis3.16.10的二次开发过程常见的问题做了整理,供大家参考,也便于日后查阅.该内容分为四部分: ...

  6. 零基础入门Linux有什么好的学习方法吗?(超详细)

    本节旨在介绍对于初学者如何学习 Linux 的建议,在这里不具体分析Linux的学习节点只分析对于零基础的伙伴的学习方法.那么如果你已经确定对 Linux 产生了兴趣,那么接下来我们介绍一下学习 Li ...

  7. 零基础学习STM32之入门学习路线

    可以说就目前的市场需求来看,stm32在单片机领域已经拥有了绝对的地位,51什么的已经过时了也只能拿来打基础了,最后依然会转到stm32来,也正是因为这样stm32的学习者越来越多,其中不难发现绝大部 ...

  8. AXI协议中的模棱两可的含义的解释(Cachable和Bufferable)

    转载:https://blog.csdn.net/hit_shaoqi/article/details/53243173 Cachable和Bufferable 一个Master发出一个读写的requ ...

  9. 第k短路(Dijkstra & A*)

    最短路,即第1短路有很多种求法,SPFA,Dijkstra等,但第k短路怎么求呢?其实也是基于Dijkstra:因为Dijkstra用的是堆优化,这样保证每次弹出来的都是最小值,只是求最短路只是弹出一 ...

  10. SpringCloud微服务实战——搭建企业级开发框架(十四):集成Sentinel高可用流量管理框架【限流】

      Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流.流量整形.熔断降级.系统负载保护.热点防护等多个维度来帮助开发者保障微服务的稳定性. Sentinel 具有 ...