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. Git_学习_02_ 分支

    Git鼓励大量使用分支: 1.查看分支:git branch 2.创建分支:git branch <name> 3.切换分支:git checkout <name> 4.创建+ ...

  2. listen 57

    Secondhand Smoke Exposure Doubled Asthmatic Kids' Hospital Readmissions If your child has asthma哮喘, ...

  3. java面试题07

    1.重载和重写的区别? 重载(Overload):(1)方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型.重载Overloading是一个类中多态性 ...

  4. 如何卸载ubuntu软件

    你的硬盘空间已经不太足够了?如果你使用的是Ubuntu操作系统,你可能想知道如何能够卸载过时.无用的程序.有几种方法可以卸载程序,包括图形化方法和命令行方法.参考本指南,采用最适合你的方法卸载程序. ...

  5. 「LuoguP1429」 平面最近点对(加强版)

    题目描述 给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的 输入输出格式 输入格式: 第一行:n:2≤n≤200000 接下来n行:每行两个实数:x y, ...

  6. BZOJ3772:精神污染

    浅谈主席树:https://www.cnblogs.com/AKMer/p/9956734.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem.p ...

  7. DataGrid 显示选中的item

    Datagrid或者listview 中想要把相应的项 滚动到当前可见的位置, 必须满足2个条件: 1) 必须去掉虚拟化      VirtualizingStackPanel.IsVirtualiz ...

  8. 微信小程序开发之拼接json数组字符串

    直接上代码   : var imageitem;    var imageitemstring='';    for(var i=0;i< that.data.fbimages.length;i ...

  9. Centos7.2 下安装配置pip

    一.pip下载 wget https://files.pythonhosted.org/packages/ae/e8/2340d46ecadb1692a1e455f13f75e596d4eab3d11 ...

  10. 软件工程作业——Word Counter

    github地址 https://github.com/Pryriat/Word_Counter 项目说明 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命 ...