题目链接:http://codeforces.com/problemset/problem/510/E


乍一看和那啥魔术球问题有点神似啊/XD

其实是不一样的。

解决这道问题的关键在于发现若是相邻的两个数的和是质数,那么他们必定是一奇一偶!

而且一个奇数旁边一定是两个偶数,一个偶数旁边一定是两个奇数(因为是一个大于$3$的环)

秒啊!这就变成了匹配模型。

源点向所有值为奇数的点连容量为$2$边,值为奇数的点向所有与它的和为质数的且值为偶数点连容量为$1$边,所有值为偶数的点向汇点连容量为$2$的边。

跑一边最大流,我们是不是就求出了最大的合法的匹配方案?

如果最大流为$n$才说明了每一个点都匹配上了。

考虑输出方案,$DFS$在$Dinic$之后留下的图,如果流量发生了变化则沿这条路径走下去(当然不能走到源点或者汇点)


  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<vector>
  5 #include<cstdlib>
  6 #include<cmath>
  7 #include<cstring>
  8 using namespace std;
  9 #define maxn 1010
 10 #define inf 0x7fffffff
 11 #define llg int
 12 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
 13 llg n,m,ans,c[maxn],cnt1,cnt2,tot[maxn];
 14 llg d[maxn][maxn];
 15 inline int getint()
 16 {
 17     int w=0,q=0; char c=getchar();
 18     while((c<'0' || c>'9') && c!='-') c=getchar(); if(c=='-') q=1,c=getchar();
 19     while (c>='0' && c<='9') w=w*10+c-'0', c=getchar(); return q ? -w : w;
 20 }
 21
 22 struct DINIC
 23 {
 24     llg N;
 25     vector<llg>a[maxn],ba[maxn],val[maxn],stval[maxn];
 26     llg dl[maxn],deep[maxn];
 27     bool bj[maxn];
 28
 29     void link(llg x,llg y,llg z)
 30     {
 31         a[x].push_back(y),val[x].push_back(z); stval[x].push_back(z);
 32         a[y].push_back(x),val[y].push_back(0); stval[y].push_back(0);
 33         ba[x].push_back(a[y].size()-1),ba[y].push_back(a[x].size()-1);
 34     }
 35
 36     llg dfs(llg x,llg low)
 37     {
 38         llg va=0,inc=0;
 39         if (x==N) return low;
 40         llg w=a[x].size(),v;
 41         for (llg i=0;i<w;i++)
 42         {
 43             v=a[x][i];
 44             if (deep[x]+1==deep[v] && val[x][i]>0 && (va=dfs(v,min(low,val[x][i]))))
 45             {
 46                 val[x][i]-=va; val[v][ba[x][i]]+=va; inc+=va;
 47                 return va;
 48             }
 49         }
 50         if (!inc) deep[x]=-1;
 51         return 0;
 52     }
 53
 54     void fencen()
 55     {
 56         llg x,w,v; deep[0]=0;
 57         memset(bj,0,sizeof(bj));
 58         llg head=0,tail=1; dl[1]=0; bj[0]=1;
 59         do
 60         {
 61             x=dl[++head]; w=a[x].size();
 62             for (llg i=0;i<w;i++)
 63             {
 64                 v=a[x][i];
 65                 if (bj[v] || val[x][i]<=0) continue;
 66                 dl[++tail]=v;
 67                 deep[v]=deep[x]+1; bj[v]=1;
 68             }
 69         }while (head!=tail);
 70     }
 71
 72     llg dinic()
 73     {
 74         llg ans=0;
 75         while (1)
 76         {
 77             fencen();
 78             if (!bj[N]) break;
 79             ans+=dfs(0,inf);
 80         }
 81         return ans;
 82     }
 83
 84     void DFS(llg x)
 85     {
 86         bj[x]=1;
 87         tot[ans]++;
 88         d[ans][tot[ans]]=x;
 89         llg w=a[x].size(),v;
 90         for (llg i=0;i<w;i++)
 91         {
 92             v=a[x][i];
 93             if (v==0 || v==N || bj[v]) continue;
 94             if (stval[x][i]==val[x][i]) continue;
 95             DFS(v);
 96         }
 97     }
 98
 99     bool pd(llg x)
100     {
101         llg cs=0,w=a[x].size(),v;
102         for (llg i=0;i<w;i++)
103         {
104             v=a[x][i];
105             if (v==0 || v==N) continue;
106             if (bj[v] || val[x][i]==stval[x][i]) continue;
107             cs++;
108         }
109         if (cs>2) return 0;else return 1;
110     }
111
112     void make_ans()
113     {
114         memset(bj,0,sizeof(bj));
115         while (1)
116         {
117             bool WK=0;
118             for (llg i=1;i<=n;i++)
119                 if (!bj[i])
120                 {
121                     if (!pd(i)) continue;
122                     WK=1;
123                     ans++;
124                     DFS(i);
125                 }
126             if (!WK) break;
127         }
128     }
129 }G;
130
131 bool check(llg v1,llg v2)
132 {
133     llg x=v1+v2;
134     llg up=sqrt(x+1);
135     for (llg i=2;i<=up;i++)
136         if (x%i==0) return 0;
137     return 1;
138 }
139
140 void init()
141 {
142     cin>>n;
143     for (llg i=1;i<=n;i++) c[i]=getint();
144     for (llg i=1;i<=n;i++)
145     {
146         if (c[i]%2) G.link(0,i,2),cnt1++; else G.link(i,n+1,2),cnt2++;
147            if (c[i]%2==0) continue;
148         for (llg j=1;j<=n;j++)
149             if (i!=j && check(c[i],c[j]))
150                 G.link(i,j,1);
151     }
152     G.N=n+1;
153 }
154
155 int main()
156 {
157     yyj("flows");
158     init();
159     if (cnt1!=cnt2) {cout<<"Impossible"; return 0;}
160     llg flows=G.dinic();
161     if (flows!=n)  {cout<<"Impossible"; return 0;}
162     G.make_ans();
163     cout<<ans<<endl;
164     for (llg i=1;i<=ans;i++)
165     {
166         cout<<tot[i]<<" ";
167         for (llg j=1;j<=tot[i];j++) cout<<d[i][j]<<" ";
168         cout<<endl;
169     }
170     return 0;
171 }

转载于:https://www.cnblogs.com/Dragon-Light/p/6556322.html

Codeforces 510 E. Fox And Dinner相关推荐

  1. CodeForces - 510E Fox And Dinner(最大流+奇偶建边+路径打印)

    题目链接:点击查看 题目大意:给出n只狐狸,需要按照下列要求为其安排座位: 每只狐狸必须都要有位置 每张圆桌至少坐三只狐狸 相邻每两只狐狸的年龄和必须是素数 要求判断能否在符合上述要求的情况下分配座位 ...

  2. 【CodeForces - 510D】Fox And Jumping(dp,stlmap,数论的性质)

    题干: Fox Ciel is playing a game. In this game there is an infinite long tape with cells indexed by in ...

  3. python如何设计工具类_Python基础之自定义工具类

    class ListHelper: @staticmethod def find_all(target, func_condition): """ 查找列表中满足条件的所 ...

  4. 近期打算及毕业前要补完的题

    之前总是开玩笑的说"退竞了退竞了",这次看来是真的退役了.想想这一年来的学习历程,有欢笑也有汗水.可能还是因为自己太菜,可能还是因为自己不够努力,最终还是滚去学文化课了. 辜负了教 ...

  5. linux下模糊搜索命令,linux命令当前文件夹下面模糊搜索文件

    权限管理AppOpsManager AppOps工具类 import android.annotation.TargetApi; import android.app.AppOpsManager; i ...

  6. 网络流专题班例题和练习

    文章目录 概 念 网络流图 可行流 可改进路(增广路) 残留网络 割 基本理论 求最大流思路 EK算法 dinic 最小费用最大流 EK+spfa dinic + spfa 例 题 poj Power ...

  7. Codeforces Round #510 (Div. 2)

    Codeforces Round #510 (Div. 2) https://codeforces.com/contest/1042 A 二分 1 #include<iostream> 2 ...

  8. CodeForces 389A Fox and Number Game

    链接:http://codeforces.com/problemset/problem/389/A Fox and Number Game time limit per test:1 second m ...

  9. codeforces B. Fox and Cross 解题报告

    题目链接:http://codeforces.com/problemset/problem/389/B 题目意思:给出一个由n行n列组成的board,其中'#'表示的一片地方恰好能画满十字架,画满的意 ...

最新文章

  1. 牛客竞赛语法入门班数组模拟、枚举、贪心习题【未完结】
  2. pdf.js 在线浏览pdf组件构建与安装注意事项
  3. tensorflow中的关键字global_step使用
  4. golang微服务框架对比_Go语言开发的微服务框架,你了解多少?
  5. 【数据竞赛】组合特征的构建技巧,如何快速构建百大组合特征池
  6. oracle入门(8)——实战:支持可变长参数、多种条件、多个参数排序、分页的存储过程查询组件...
  7. WPF 使用 Expression Design 画图导出及使用 Path 画图
  8. 英文期刊催稿信模板_手把手教你写投稿信,另附查尔斯沃思高质量模板
  9. python逻辑运算符的使用_总结Python中逻辑运算符的使用
  10. webbrowser设置横向打印_C# 日常记录:指定打印机/纸张/纸盒(静默打印)(不弹窗打印)WinForm篇...
  11. django 坑~~
  12. 关于linux模块驱动简单的Makefile
  13. 零代码、不花钱就能做大屏,这个报表工具帮了大忙
  14. 删除了几个月的照片能找回么_iPhone的相册管理功能居然这么强大?删掉的照片还能这样找回?...
  15. 为什么机器学习工程师严重短缺?
  16. 关于新功能研发的一些脑洞
  17. 华为q1设置虚拟服务器,华为荣耀路由器怎么设置?华为路由器Q1的无线网络设置方法...
  18. B 站 CEO 的身份证被上传到 GitHub 了?这个火了
  19. vim忽略大写和小写查找配置
  20. 英语学习详细笔记(九)分词

热门文章

  1. 大数据开发工具hive内部常用函数都有哪些?
  2. 现在加入Web前端学习还有市场吗?自己是否适合学习前端
  3. 华为仿苹果字体_苹果手机和华为手机,同样的网络下为何我的手机网速这么差?...
  4. 软件技术论坛_新一代三维GIS软件技术论坛在南宁召开
  5. python字典遍历 没有顺序_Python实现字典的遍历与排序功能示例
  6. python中avg函数的使用_SQL AVG()
  7. python排序方法_python内置的排序方法
  8. python operator 多属性排序_Python爬取高颜值美女(爬虫+人脸检测+颜值检测)你能打几分?...
  9. php swoole 游戏框架,Swoole 高性能php框架
  10. 五万pv的小程序需要什么服务器,一个公式,告诉你PV千万的刷屏小程序都是怎么玩的...