http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1550

很久以前做的一题,当时队友用最大流做,现在我也是

这个转化为二分图多重匹配,就是一样的意思了。

设出一个原点S,两个人1,和2,S-->1的流量是n表明只能流出n个字母,s-->2的流量是n,一样含义。

然后再设一个汇点T,表明需要有多少流进来,跑一发就好。

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
const int maxn = * ;
struct Edge {
int u, v, w, tonext;
int id;
}e[maxn * ];
int first[maxn], num;
void addEdge(int u, int v, int w) {
e[num].u = u, e[num].v = v, e[num].w = w, e[num].tonext = first[u], e[num].id = num;
first[u] = num++;
}
int flow[maxn], pre[maxn];
int bfs(int be, int en) { //O(n * E * E)
queue<int> que;
memset(flow, false, sizeof flow);
pre[be] = -, flow[be] = inf;
que.push(be);
while (!que.empty()) {
int cur = que.front();
que.pop();
for (int i = first[cur]; ~i; i = e[i].tonext) {
int v = e[i].v;
if (flow[v] == && e[i].w > ) {
pre[v] = e[i].id;
flow[v] = min(flow[cur], e[i].w);
que.push(v);
}
}
if (flow[en]) break; //找到了增广路
}
if (flow[en] == ) return -;
else return flow[en];
} int maxFlow(int be, int en) {
int sumFlow = ;
while (true) {
int res = bfs(be, en);
if (res == -) { //找不到增广路
break;
}
int edgeID = pre[en];
while (edgeID != -) {
e[edgeID].w -= res;
e[edgeID ^ ].w += res;
edgeID = pre[e[edgeID].u];
}
sumFlow += res;
}
return sumFlow;
}
char s1[maxn], s2[maxn], s3[maxn];
int cnt1[], cnt2[], cnt3[];
void work() {
memset(cnt1, , sizeof cnt1);
memset(cnt2, , sizeof cnt2);
memset(cnt3, , sizeof cnt3);
memset(first, -, sizeof first);
num = ;
int lenstr = strlen(s1 + );
addEdge(, , lenstr / );
addEdge(, , );
addEdge(, , lenstr / );
addEdge(, , );
for (int i = ; i <= lenstr; ++i) {
cnt1[s1[i]]++;
cnt2[s2[i]]++;
cnt3[s3[i]]++;
}
for (int i = 'A'; i <= 'Z'; ++i) {
addEdge(, i - 'A' + , cnt1[i]);
addEdge(i - 'A' + , , );
addEdge(, i - 'A' + , cnt2[i]);
addEdge(i - 'A' + , , cnt2[i]);
}
for (int i = 'A'; i <= 'Z'; ++i) {
addEdge(i - 'A' + , , cnt3[i]);
addEdge(, i - 'A' + , );
}
int res = maxFlow(, );
if (res == lenstr) {
printf("YES\n");
} else printf("NO\n");
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
while (scanf("%s%s%s", s1 + , s2 + , s3 + ) > ) work();
return ;
}

1550: Simple String 最大流解法的更多相关文章

  1. 1550: Simple String (做得少的思维题,两个字符串能否组成另外一个字符串问题)

    1550: Simple String Submit Page    Summary    Time Limit: 1 Sec     Memory Limit: 256 Mb     Submitt ...

  2. Water --- CSU 1550: Simple String

    Simple String Problem's Link:   http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1550 Mean: 略. analy ...

  3. CSU - 1550 Simple String —— 字符串

    题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1550 题解: 1.A+B 与C的交集必须>=n 2.A与C的交集必须>= ...

  4. 【stanford C++】字符串(String)与流(Stream)

    字符串(String)与流(Stream) 一.C++中字符串(String) 字符串(String):就是(可能是空的)字符序列. C++中的字符串在概念上和Java中的字符串类似. C++字符串用 ...

  5. 线性规划费用流解法(Bzoj1061: [Noi2008]志愿者招募)

    题面 传送门 Sol 线性规划费用流解法用与求解未知数为非负数的问题 这道题可以列出一堆形如 \(x[i]+x[j]+x[k]+...>=a[p]\) 的不等式 我们强行给每个式子减去一个东西, ...

  6. (比赛)A - Simple String Problem

    A - Simple String Problem Time Limit:10000MS     Memory Limit:65536KB     64bit IO Format:%lld & ...

  7. FZU - 2218 Simple String Problem(状压dp)

    Simple String Problem Recently, you have found your interest in string theory. Here is an interestin ...

  8. D - Simple String CSU - 1550

    http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1550 很久都没补这题,最近想学网络流,就看看,队友以前用网络流过的,Orz, 但是这题只需要简 ...

  9. delphi 怎么将一个文件流转换成字符串(String到流,String到文件,相互转化)

    //from   http://kingron.myetang.com/zsfunc0d.htm (*//   标题:充分利用pascal字符串类型   说明:和PChar不同,string可以保存# ...

随机推荐

  1. css书写规则

    无规矩不成方圆,不管有多少人共同参与同一项目,一定要确保每一行代码都像是同一个人编写的 不要在自闭合(self-closing)元素的尾部添加斜线 不要省略可选的结束标签(closing tag)(例 ...

  2. NO2:设置RedHat Linux下的samba开机启动

    安装的samba默认不是开机启动的,这样每次都要进入系统人为启动,很不方便,当然系统肯定可以设置开机启动的. 因为我的是RedHat Linux系统,支持chkconfig命令直接配置,会简单些,其它 ...

  3. k8s-集群状态及部署一个实例

    [root@k8s-master ~]# kubectl get csNAME STATUS MESSAGE ERRORcontroller-manager Healthy ok scheduler ...

  4. poj2777Count Color——线段树+状压

    题目:http://poj.org/problem?id=2777 状压每个颜色的选择情况,取答案时 | 一番: 注意题目中的区间端点可能大小相反,在读入时换一下位置: 注意pushdown()中要l ...

  5. Jasper-Api:接口测试

    ylbtech-Jasper-Api:接口测试 1. EditTerminal返回顶部 1. /// <remarks/> [System.Web.Services.Protocols.S ...

  6. 杂项-QRCode:ZXing

    ylbtech-杂项-QRCode:ZXing 1.返回顶部 1. ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口.Zxing可以实现使用 ...

  7. Eclipse+Maven

    http://www.cnblogs.com/alunchen/p/5632497.html

  8. ng2父子模块通信@ViewChild和@Inject

    一.@ViewChild 父组件中使用@ViewChild拿到子组件的变量和方法(父组件可调用子组件的方法和变量) parent.component.ts: import { Component, O ...

  9. caffe solver

    caffe solver https://groups.google.com/forum/#!topic/caffe-users/mUIi42aKWHQ https://github.com/BVLC ...

  10. GridSplitter用法

    1.GridSplitter的ShowsPreview设置为True时拖动报null错误 解决方法在Grid外面包装一个装饰器:AdornerDecorator,至于为什么这么做,暂时还不知道 2.当 ...