题解 CF510E 【Fox And Dinner】
可以用网络流解决这个题。
注意到\(a_i \geqslant 2\),所以当相邻数字要和为质数时,这两个数要一个为奇数,一个为偶数。
所以就先将所有数按奇偶分为两列,其就构成了一个二分图,二分图中和为质数的两个数间连容量为\(1\)的边,表示只能匹配一次。
因为是圆桌,所以一个数要恰好匹配两个数,所以每个点在和源汇点连边时,容量要为\(2\),同时这也保证了每个圆桌中至少有\(3\)个狐狸。
无解的情况就是二分图两个部分大小不是都为\(\frac{n}{2}\)或最大流的结果不为\(n\)。
在跑完最大流后的残量网络中找环即可确定满足要求的分配方案。
\(code:\)
#include<bits/stdc++.h>
#define maxn 400010
#define all 20000
#define inf 1000000000
using namespace std;
template<typename T> inline void read(T &x)
{
x=0;char c=getchar();bool flag=false;
while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
if(flag)x=-x;
}
int n,tot,s,t,cnt1,cnt2,ans;
int a[maxn],p1[maxn],p2[maxn],p[maxn],cur[maxn],d[maxn];
bool tag[maxn],vis[maxn];
vector<int> ve[maxn];
struct edge
{
int to,nxt,v;
}e[maxn];
int head[maxn],edge_cnt=1;
void add(int from,int to,int val)
{
e[++edge_cnt]=(edge){to,head[from],val},head[from]=edge_cnt;
e[++edge_cnt]=(edge){from,head[to],0},head[to]=edge_cnt;
}
bool bfs()
{
queue<int> q;
for(int i=s;i<=t;++i) cur[i]=head[i],d[i]=0;
q.push(s),d[s]=1;
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=head[x];i;i=e[i].nxt)
{
int y=e[i].to,v=e[i].v;
if(d[y]||!v) continue;
d[y]=d[x]+1,q.push(y);
}
}
return d[t];
}
int dfs(int x,int lim)
{
if(x==t) return lim;
int res=lim,flow;
for(int &i=cur[x];i;i=e[i].nxt)
{
int y=e[i].to,v=e[i].v;
if(d[y]!=d[x]+1||!v) continue;
if(flow=dfs(y,min(res,v)))
{
res-=flow;
e[i].v-=flow;
e[i^1].v+=flow;
if(!res) break;
}
}
return lim-res;
}
int dinic()
{
int flow,v=0;
while(bfs())
while(flow=dfs(s,inf))
v+=flow;
return v;
}
void init()
{
for(int i=2;i<=all;++i)
{
if(!tag[i]) p[++tot]=i;
for(int j=1;j<=tot;++j)
{
int k=i*p[j];
if(k>all) break;
tag[k]=true;
if(i%p[j]==0) break;
}
}
}
void dfs_ans(int x,int type)
{
vis[x]=true,ve[ans].push_back(x);
for(int i=head[x];i;i=e[i].nxt)
{
int y=e[i].to;
if(e[i^type].v||vis[y]) continue;
dfs_ans(y,type^1);
}
}
int main()
{
init(),read(n),t=n+1;
for(int i=1;i<=n;++i)
{
read(a[i]);
if(a[i]&1) p1[++cnt1]=i;
else p2[++cnt2]=i;
}
if(cnt1!=cnt2)
{
puts("Impossible");
return 0;
}
for(int i=1;i<=n/2;++i)
for(int j=1;j<=n/2;++j)
if(!tag[a[p1[i]]+a[p2[j]]])
add(p1[i],p2[j],1);
for(int i=1;i<=n/2;++i) add(s,p1[i],2);
for(int i=1;i<=n/2;++i) add(p2[i],t,2);
if(dinic()!=n)
{
puts("Impossible");
return 0;
}
vis[s]=vis[t]=true;
for(int i=1;i<=n/2;++i)
{
if(vis[p1[i]]) continue;
ans++,dfs_ans(p1[i],0);
}
printf("%d\n",ans);
for(int i=1;i<=ans;++i)
{
printf("%d ",ve[i].size());
for(int j=0;j<ve[i].size();++j)
printf("%d ",ve[i][j]);
puts("");
}
return 0;
}
题解 CF510E 【Fox And Dinner】的更多相关文章
- CF510E. Fox And Dinner
CF510E. Fox And Dinner https://codeforces.com/contest/510 分析: 由于\(a_i>2\), 相邻两个数一定一奇一偶,按奇偶建立二分图. ...
- Codeforces Round #290 (Div. 2) E. Fox And Dinner 网络流建模
E. Fox And Dinner time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- 网络流 I - Fox And Dinner CodeForces - 510E
Fox Ciel is participating in a party in Prime Kingdom. There are n foxes there (include Fox Ciel). T ...
- 网络流(最大流)CodeForces 512C:Fox And Dinner
Fox Ciel is participating in a party in Prime Kingdom. There are n foxes there (include Fox Ciel). T ...
- [CF#290 Div.1 C]Fox And Dinner(最大流)
题目:http://codeforces.com/contest/512/problem/C 题目大意:给你若干个数,让你分成k组,每组围成一个圆,使得相邻两个数和均为素数,且每组人数应>=3个 ...
- CodeForces Round #290 Fox And Dinner
而是Div2的最后一题,当时打比赛的时候还不会最大流.自己能够把它写出来然后1A还是很开心的. 题意: 有n个不小于2的整数,现在要把他们分成若干个圈.在每个圈中,数字的个数不少于3个,而且相邻的两个 ...
- codeforces 510E. Fox And Dinner 网络流
题目链接 给出n个人, 以及每个人的值, 要求他们坐在一些桌子上面, 每个桌子如果有人坐, 就必须做3个人以上. 并且相邻的两个人的值加起来必须是素数.每个人的值都>=2. 由大于等于2这个条件 ...
- CodeForces 510E Fox And Dinner
网络流. 原点到偶数连边,容量为2, 奇数到汇点连边,容量为2, 偶数到与之能凑成素数的奇数连边,容量为1 如果奇数个数不等于偶数个数,输出不可能 如果原点到偶数的边不满流,输出不可能 剩下的情况有解 ...
- Codeforces 510 E. Fox And Dinner
题目链接:http://codeforces.com/problemset/problem/510/E 乍一看和那啥魔术球问题有点神似啊/XD 其实是不一样的. 解决这道问题的关键在于发现若是相邻的两 ...
随机推荐
- Qt布局的简单介绍
1 介绍 参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=25 布局的好处:布局之后,改变主窗口大小,其余窗口可以自适应. 2 布局分类 垂直 ...
- 入门大数据---Elasticsearch是什么?
Elasticsearch是谁不重要,重要的是咱们都知道百度,谷歌这样的搜索巨头吧.它们的核心技术都利用了Elasticsearch,所以我们有必要对Elasticsearch了解下! 1.Elast ...
- Prince and princess——需要优化的DP
一个时间效率为o(nlogn)的算法求公共子序列的应用 Prince and princess 题目大意(已翻译 ) 在nxn的棋盘上,王子和公主玩游戏.棋盘上的正方形编号为1.2.3 ... n * ...
- 6.26模拟赛(1)总结(T1:信息传递;T2:传染病控制;T3:排列;T4:最大数)
16:33:56 2020-06-26 当然可以先看一下成绩: 非常显然的成绩不能算有多好,当然其实这也可能是假期水课的报应 (额) 但是比我集训前想象的要好一点(集训时想象的是排名前30就可以,嗯 ...
- 线性DP之小烈送菜
小烈送菜 小烈一下碰碰车就被乐满地的工作人员抓住了.作为扰乱秩序的惩罚,小烈必须去乐满地里的"漓江村"饭店端盘子. 服务员的工作很繁忙.他们要上菜,同时要使顾客们尽量高兴.一位服务 ...
- python学习笔记之装饰器、生成器、内置函数、json(五)
一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里面 ...
- 一文说通Blazor for Server-Side的项目结构
用C#代替Javascript来做Web应用,是有多爽? 今天聊聊 Blazor. Blazor 是一个 Web UI 框架.这个框架允许开发者使用 C# 来创建可运行于浏览器的具有完全交互 UI ...
- day45 如何完全删除mysql服务
卸载mysql之后,mysql的服务无法删除 解决方案 在我们在卸载mysql后会有一些东西没有删除干净,当我们把这些内容清除干净后,服务自然就消失了 步骤一: 如果是默认安装的话 在这三个文件内都有 ...
- day25 作业(ATM第一版)
目录 conf.setting.py core.src.py db.db_handler.py interface.admin_interface interface.bank_interface i ...
- scrapy shell 的使用
是什么?:是一个终端下的调试工具,用来调试scrapy 安装ipython :pip install ipython 启动: scrapy shell + 需要请求的url 进来之后,response ...