codeforces 510E. Fox And Dinner 网络流
2015-12-12 23:58
549 查看
题目链接
给出n个人, 以及每个人的值, 要求他们坐在一些桌子上面, 每个桌子如果有人坐, 就必须做3个人以上。 并且相邻的两个人的值加起来必须是素数。每个人的值都>=2.
由大于等于2这个条件, 可以知道素数都是奇数, 那么很明显就需要一奇一偶相邻这样做, 那么一个桌子上必定有偶数个人。 一个奇数旁边有两个偶数, 一个偶数旁边有两个奇数。
所以可以先判断n是否为偶数, 如果是奇数直接输出不可能。
然后开始奇偶建边, 源点和奇数建边, 权值为2, 因为一个奇数需要和两个偶数匹配; 偶数和汇点建边, 同理权值也为2。
然后, 如果一个奇数和一个偶数相加得到的数是素数, 那么奇数向偶数连一条边, 权值为1。
这样跑一遍网络流, 看结果是否等于n, 如果不相等, 说明不可能。如果可能, dfs一下就可以求出几个桌子, 每个桌子上面几个人了。
给出n个人, 以及每个人的值, 要求他们坐在一些桌子上面, 每个桌子如果有人坐, 就必须做3个人以上。 并且相邻的两个人的值加起来必须是素数。每个人的值都>=2.
由大于等于2这个条件, 可以知道素数都是奇数, 那么很明显就需要一奇一偶相邻这样做, 那么一个桌子上必定有偶数个人。 一个奇数旁边有两个偶数, 一个偶数旁边有两个奇数。
所以可以先判断n是否为偶数, 如果是奇数直接输出不可能。
然后开始奇偶建边, 源点和奇数建边, 权值为2, 因为一个奇数需要和两个偶数匹配; 偶数和汇点建边, 同理权值也为2。
然后, 如果一个奇数和一个偶数相加得到的数是素数, 那么奇数向偶数连一条边, 权值为1。
这样跑一遍网络流, 看结果是否等于n, 如果不相等, 说明不可能。如果可能, dfs一下就可以求出几个桌子, 每个桌子上面几个人了。
#include<bits/stdc++.h> using namespace std; #define pb(x) push_back(x) #define ll long long #define mk(x, y) make_pair(x, y) #define lson l, m, rt<<1 #define mem(a) memset(a, 0, sizeof(a)) #define rson m+1, r, rt<<1|1 #define mem1(a) memset(a, -1, sizeof(a)) #define mem2(a) memset(a, 0x3f, sizeof(a)) #define rep(i, a, n) for(int i = a; i<n; i++) #define ull unsigned long long typedef pair<int, int> pll; const double PI = acos(-1.0); const double eps = 1e-8; const int mod = 1e9+7; const int inf = 1061109567; const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} }; const int maxn = 2e5; int prime[20005]; int q[maxn*2], head[maxn*2], dis[maxn/10], s, t, a[205], num, vis[205]; struct node { int to, nextt, c; node(){} node(int to, int nextt, int c):to(to), nextt(nextt), c(c){} }e[maxn*2]; void init() { num = 0; mem1(head); } void pre() { for(int i = 2; i<=20000; i++) { if(!prime[i]) for(int j = i*i; j<=20000; j+=i) { prime[j] = 1; } } } void add(int u, int v, int c) { e[num] = node(v, head[u], c); head[u] = num++; e[num] = node(u, head[v], 0); head[v] = num++; } int bfs() { mem(dis); dis[s] = 1; int st = 0, ed = 0; q[ed++] = s; while(st<ed) { int u = q[st++]; for(int i = head[u]; ~i; i = e[i].nextt) { int v = e[i].to; if(!dis[v]&&e[i].c) { dis[v] = dis[u]+1; if(v == t) return 1; q[ed++] = v; } } } return 0; } int dfs(int u, int limit) { if(u == t) { return limit; } int cost = 0; for(int i = head[u]; ~i; i = e[i].nextt) { int v = e[i].to; if(e[i].c&&dis[v] == dis[u]+1) { int tmp = dfs(v, min(limit-cost, e[i].c)); if(tmp>0) { e[i].c -= tmp; e[i^1].c += tmp; cost += tmp; if(cost == limit) break; } else { dis[v] = -1; } } } return cost; } int dinic() { int ans = 0; while(bfs()) { ans += dfs(s, inf); } return ans; } vector <int> ve[205]; void dfs1(int u, int pos) { ve[pos].pb(u); vis[u] = 1; for(int i = head[u]; ~i; i = e[i].nextt) { int v = e[i].to; if(vis[v]) continue; if(v == t|| v == s) continue; if(i%2==0&&!e[i].c) { dfs1(v, pos); } if(i%2==1&&!e[i^1].c) dfs1(v, pos); } } int main() { int n; cin>>n; init(); pre(); for(int i = 0; i<n; i++) { scanf("%d", &a[i]); } if(n&1) { cout<<"Impossible"<<endl; return 0; } s = n+1, t = n+2; for(int i = 0; i<n; i++) { if(a[i]&1) { add(s, i, 2); } else { add(i, t, 2); } } for(int i = 0; i<n; i++) { for(int j = i+1; j<n; j++) { if((a[i]&1) != (a[j]&1)) { if(!prime[a[i]+a[j]]) { if(a[i]&1) add(i, j, 1); else add(j, i, 1); } } } } int ans = dinic(); if(ans != n) { cout<<"Impossible"<<endl; return 0; } int cnt = 0; for(int i = 0; i<n; i++) { if(!vis[i]) { dfs1(i, cnt++); } } cout<<cnt<<endl; for(int i = 0; i<cnt; i++) { cout<<ve[i].size()<<" "; for(int j = 0; j<ve[i].size(); j++) { cout<<ve[i][j]+1<<" "; } cout<<endl; } return 0; }
相关文章推荐
- DetNet 确定性的网络
- HttpHandler,HttpApplication, HttpModule
- 牛客网 debug-release http://www.nowcoder.com/profile/380772/test/2198844/36245?onlyWrong=0
- 牛客网 鼠标事件 http://www.nowcoder.com/profile/380772/test/2198844/16026?onlyWrong=0
- 牛客网 http://www.nowcoder.com/profile/380772/test/2198844/25222?onlyWrong=0
- Final Http的简要介绍与使用
- 使用HttpURLConnection实现图片的下载与现显示
- Linux网络配置与管理
- 判断网络连接状态并自动界面跳转
- 《RocketMq》一、网络传输篇
- 大陆为Android Studio设置HTTP代理
- android studio中在api23版本中使用HttpClient的问题
- HTTP协议
- 检查是否有网络工具类
- 简单的感知学习原理例子 人工神经网络 Perceptron Learning Rule
- 关于Http协议(2)--转载
- android5.0无法使用HttpClient解决办法
- c++父类指针指向子类的具体原理? http://www.zhihu.com/question/31345300
- 网络基础知识HTTP(1) --转载
- 残差学习,152层网络,微软夺冠2015 ImageNet计算机视觉识别挑战