这道题和 BZOJ 2400 是一道题,不多讲了

CODE

#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
typedef long long LL;
template<typename T>inline void read(T &num) {
char ch; int flg=1;
while((ch=getchar())<'0'||ch>'9')if(ch=='-')flg=-flg;
for(num=0;ch>='0'&&ch<='9';num=num*10+ch-'0',ch=getchar());
num*=flg;
}
const int inf = 1e9;
const int MAXN = 505;
const int MAXM = 30005;
int n, m, fir[MAXN], S, T, cnt;
struct edge { int to, nxt; int c; }e[MAXM];
inline void add(int u, int v, int cc, int rc=0) {
e[cnt] = (edge){ v, fir[u], cc }; fir[u] = cnt++;
e[cnt] = (edge){ u, fir[v], rc }; fir[v] = cnt++;
}
int dis[MAXN], vis[MAXN], info[MAXN], cur, q[MAXN];
inline bool bfs() {
int head = 0, tail = 0;
vis[S] = ++cur; q[tail++] = S;
while(head < tail) {
int u = q[head++];
for(int i = fir[u]; ~i; i = e[i].nxt)
if(e[i].c && vis[e[i].to] != cur)
vis[e[i].to] = cur, dis[e[i].to] = dis[u] + 1, q[tail++] = e[i].to;
}
if(vis[T] == cur) memcpy(info, fir, (T+1)<<2);
return vis[T] == cur;
}
int dfs(int u, int Max) {
if(u == T || !Max) return Max;
int flow=0, delta;
for(int &i = info[u]; ~i; i = e[i].nxt)
if(e[i].c && dis[e[i].to] == dis[u] + 1 && (delta=dfs(e[i].to, min(e[i].c, Max-flow)))) {
e[i].c -= delta, e[i^1].c += delta, flow += delta;
if(flow == Max) return flow;
}
return flow;
}
inline int dinic() {
memset(vis, 0, sizeof vis);
int flow=0, x;
while(bfs()) {
while((x=dfs(S, inf))) flow+=x;
}
return flow;
}
int A[MAXN], X[3005], Y[3005], ans[MAXN];
bool flg[MAXN];
void Getans(int u, int val) {
ans[u] += val; flg[u] = 1;
for(int i = fir[u]; ~i; i = e[i].nxt)
if(e[i].c && !flg[e[i].to])
Getans(e[i].to, val);
}
int main () {
int kase;
read(kase);
while(kase--) {
read(n); read(m); S = 0, T = n+1;
memset(A, -1, sizeof A);
for(int i = 1; i <= m; ++i) read(X[i]), read(Y[i]);
int tot, x, y;
read(tot); while(tot--) read(x), read(y), A[x] = y;
for(int bit = 0; bit < 31; ++bit) {
memset(fir, -1, sizeof fir); cnt = 0;
for(int i = 1; i <= m; ++i) add(X[i], Y[i], 1, 1);
for(int i = 1; i <= n; ++i) {
if(A[i] < 0) continue;
if(A[i]&(1<<bit)) add(S, i, inf);
else add(i, T, inf);
}
memset(flg, 0, sizeof flg);
dinic(); Getans(S, 1<<bit);
}
for(int i = 1; i <= n; ++i)
printf("%d\n", ans[i]), ans[i] = 0;
}
}

最新文章

  1. Qt——消息对话框的设计
  2. 让 MySQL 在 Linux 下表名不区分大小写(实为表名全小写)
  3. mac环境brew安装freetype,imagick等yii2所需要的库
  4. windbg 基础命令实战 - 简单程序破解
  5. storm源码之storm代码结构【译】【转】
  6. C语言的学习-基础知识点
  7. JSP简介
  8. 轻狂写的桌面日历秀NSIS脚本供大家参考学习
  9. VisualStudio程序运行后控制台窗口一闪就没了
  10. php之微信公众号发送模板消息参观模仿
  11. reportNG定制化之失败截图及日志
  12. MapServer Configuring with IIS
  13. Ruby学习笔记4: 动态web app的建立
  14. 多媒体基础知识之PCM数据《 转》
  15. 【转】SpringMVC Controller 介绍
  16. 【持续更新】一个简洁、易用的美赛LaTeX模板: easyMCM
  17. python(13)多线程:线程池,threading
  18. js数组的forEach方法能不能修改数组的值
  19. c++学习笔记(新手学习笔记,如有错误请与作者联系)
  20. BZOJ1069 [SCOI2007]最大土地面积 【凸包 + 旋转卡壳】

热门文章

  1. 原生JS+ CSS3创建loading加载动画;
  2. 并行forearch的使用及测试(Parallel.Foreach)
  3. ota编译及差分包制作
  4. JAVA MAC 比较大小
  5. Office常用快捷键大全,包含 Word、Excel、PowerPoint
  6. 题解 luoguP3554 【[POI2013]LUK-Triumphal arch】
  7. C++中如何记录程序运行时间
  8. 面试经典算法:快速排序Golang实现
  9. java多线程:继承Thread和实现Runable接口的区别
  10. sqlserver使用EF模型经验