Codeforces 510 E. Fox And Dinner
题目链接: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相关推荐
- CodeForces - 510E Fox And Dinner(最大流+奇偶建边+路径打印)
题目链接:点击查看 题目大意:给出n只狐狸,需要按照下列要求为其安排座位: 每只狐狸必须都要有位置 每张圆桌至少坐三只狐狸 相邻每两只狐狸的年龄和必须是素数 要求判断能否在符合上述要求的情况下分配座位 ...
- 【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 ...
- python如何设计工具类_Python基础之自定义工具类
class ListHelper: @staticmethod def find_all(target, func_condition): """ 查找列表中满足条件的所 ...
- 近期打算及毕业前要补完的题
之前总是开玩笑的说"退竞了退竞了",这次看来是真的退役了.想想这一年来的学习历程,有欢笑也有汗水.可能还是因为自己太菜,可能还是因为自己不够努力,最终还是滚去学文化课了. 辜负了教 ...
- linux下模糊搜索命令,linux命令当前文件夹下面模糊搜索文件
权限管理AppOpsManager AppOps工具类 import android.annotation.TargetApi; import android.app.AppOpsManager; i ...
- 网络流专题班例题和练习
文章目录 概 念 网络流图 可行流 可改进路(增广路) 残留网络 割 基本理论 求最大流思路 EK算法 dinic 最小费用最大流 EK+spfa dinic + spfa 例 题 poj Power ...
- Codeforces Round #510 (Div. 2)
Codeforces Round #510 (Div. 2) https://codeforces.com/contest/1042 A 二分 1 #include<iostream> 2 ...
- CodeForces 389A Fox and Number Game
链接:http://codeforces.com/problemset/problem/389/A Fox and Number Game time limit per test:1 second m ...
- codeforces B. Fox and Cross 解题报告
题目链接:http://codeforces.com/problemset/problem/389/B 题目意思:给出一个由n行n列组成的board,其中'#'表示的一片地方恰好能画满十字架,画满的意 ...
最新文章
- 牛客竞赛语法入门班数组模拟、枚举、贪心习题【未完结】
- pdf.js 在线浏览pdf组件构建与安装注意事项
- tensorflow中的关键字global_step使用
- golang微服务框架对比_Go语言开发的微服务框架,你了解多少?
- 【数据竞赛】组合特征的构建技巧,如何快速构建百大组合特征池
- oracle入门(8)——实战:支持可变长参数、多种条件、多个参数排序、分页的存储过程查询组件...
- WPF 使用 Expression Design 画图导出及使用 Path 画图
- 英文期刊催稿信模板_手把手教你写投稿信,另附查尔斯沃思高质量模板
- python逻辑运算符的使用_总结Python中逻辑运算符的使用
- webbrowser设置横向打印_C# 日常记录:指定打印机/纸张/纸盒(静默打印)(不弹窗打印)WinForm篇...
- django 坑~~
- 关于linux模块驱动简单的Makefile
- 零代码、不花钱就能做大屏,这个报表工具帮了大忙
- 删除了几个月的照片能找回么_iPhone的相册管理功能居然这么强大?删掉的照片还能这样找回?...
- 为什么机器学习工程师严重短缺?
- 关于新功能研发的一些脑洞
- 华为q1设置虚拟服务器,华为荣耀路由器怎么设置?华为路由器Q1的无线网络设置方法...
- B 站 CEO 的身份证被上传到 GitHub 了?这个火了
- vim忽略大写和小写查找配置
- 英语学习详细笔记(九)分词
热门文章
- 大数据开发工具hive内部常用函数都有哪些?
- 现在加入Web前端学习还有市场吗?自己是否适合学习前端
- 华为仿苹果字体_苹果手机和华为手机,同样的网络下为何我的手机网速这么差?...
- 软件技术论坛_新一代三维GIS软件技术论坛在南宁召开
- python字典遍历 没有顺序_Python实现字典的遍历与排序功能示例
- python中avg函数的使用_SQL AVG()
- python排序方法_python内置的排序方法
- python operator 多属性排序_Python爬取高颜值美女(爬虫+人脸检测+颜值检测)你能打几分?...
- php swoole 游戏框架,Swoole 高性能php框架
- 五万pv的小程序需要什么服务器,一个公式,告诉你PV千万的刷屏小程序都是怎么玩的...