codeforces gym 100357 J (网络流)
题目大意
有n种物品,m种建筑,p个人。 n,m,p∈[1,20]
每种建筑需要若干个若干种物品来建造。每个人打算建造一种建筑,拥有一些物品。
主角需要通过交易来建造自己的建筑,交易的前提是对方用多余的物品来换取自己需要的物品。
询问主角是否能建造成功自己的建筑,并给出方案。
解题分析
超级恶心的读入,而且有一组数据的给出方式里没有逗号,和样例所示不同= =
根据py的性质很容易想到用网络流来做。将每种物品拆成x,y两份。
若主角多了a物品b件,连一条S到物品a,x部流量为b的边。
若主角少了a物品b件,连一条物品a,y部到T流量为b的边。
若某人少了a物品b件,连一条物品a,x部流量为b到该人流量为b的边。
若某人多了a物品b件,连一条该人到物品a,y部流量为b到该人流量为b的边。 模拟了一次交易的进行。
再由每个物品的y部向每个物品的x部连一条流量为无穷大的边。 表示交易可以不停的进行。
跑一遍网络流,如果是满流的话,说明可以成功。
输出方案则再残量网络上进行一次dfs,将每一次的交易的情况依次输出。
参考程序
#include <bits/stdc++.h>
using namespace std; #define rep(i,x,y) for (int i=x;i<=y;i++)
//#define DEBUG
const int N=;
const int INF=; int n,m,p,sum,lt[N],cur[N],S,TT,T,dis[N]; struct node{
int u,v,f,nt;
}eg[N*]; map <string,int> build_number;
map <string,int> res_number;
string res_name[N];
string build_name[N];
string people_name[N];
string my_build; int build_need[N][N];
int people_has[N][N]; void add(int u,int v,int f)
{
#ifdef DEBUG
cout<<u<<" "<<v<<" "<<f<<endl;
#endif
eg[++sum]=(node){u,v,f,lt[u]}; lt[u]=sum;
eg[++sum]=(node){v,u,,lt[v]}; lt[v]=sum;
} bool bfs()
{
memset(dis,,sizeof(dis));
queue <int> Q;
dis[S]=; Q.push(S);
while (!Q.empty())
{
int u=Q.front(); Q.pop();
for (int i=lt[u];i;i=eg[i].nt)
{
int v=eg[i].v;
if (eg[i].f && !dis[v])
{
dis[v]=dis[u]+;
Q.push(v);
}
}
}
return dis[T];
} int dfs(int u,int flow)
{
if (u==T) return flow;
int res=,f;
for (int &i=cur[u];i;i=eg[i].nt)
{
int v=eg[i].v;
if (eg[i].f && dis[v]==dis[u]+)
{
f=dfs(v,min(flow-res,eg[i].f));
res+=f;
eg[i].f-=f; eg[i^].f+=f;
if (res==flow) break;
}
}
return res;
} int dinic()
{
int sum=;
while (bfs())
{
rep(i,S,T) cur[i]=lt[i];
sum+=dfs(S,INF);
}
return sum;
} void solve(int u,int fa)
{
//cout<<u<<" "<<fa<<endl;
if (u==T) return;
for (int i=lt[u];i;i=eg[i].nt)
if (i%== && eg[i^].f)
{
int v=eg[i].v;
int times=;
if (u==S) times=eg[i^].f;
rep(j,,times)
{
eg[i^].f--;
if (u>=n+ && u<=n+p)
{
//cout<<u-n<<" "<<fa<<" "<<v-n-p<<" "<<v<<endl;
cout<<"trade with "<<people_name[u-n]<<" "<<res_name[fa]<<" for "<<res_name[v-n-p]<<endl;
}
solve(v,u);
}
if (u!=S) break;
}
} int main()
{
freopen("trading.in","r",stdin);
#ifndef DEBUG
freopen("trading.out","w",stdout);
#endif
char ch;
cin.sync_with_stdio();
memset(lt,,sizeof(lt)); sum=;
cin>>p>>n>>m;
S=,TT=n*+p+,T=n*+p+;
int total=;
rep(i,,n)
{
cin>>res_name[i];
res_number[res_name[i]]=i;
} rep(i,,m)
{
cin>>build_name[i];
build_number[build_name[i]]=i;
string s;
cin>>s;
for (;;)
{
int x;
cin>>x>>s;
if (s[s.length()-]==',')
{
s.erase(s.end()-);
build_need[i][res_number[s]]=x;
}
else
{
build_need[i][res_number[s]]=x;
}
cin.get(ch);
if (ch=='\n') break;
}
} string s; cin>>s>>s>>s; if (s[s.length()-]==',') s.erase(s.end()-);
my_build=s;
cin.get(ch);
if (ch!='\n')
{
string t; cin>>t;
for (;;)
{
int x; cin>>x>>t;
if (t[t.length()-]==',')
{
t.erase(t.end()-);
people_has[][res_number[t]]=x;
}
else
{
people_has[][res_number[t]]=x;
}
cin.get(ch);
if (ch=='\n') break;
}
} rep(i,,n)
{
int y=people_has[][i]-build_need[build_number[s]][i];
if (y>) add(S,i,y);
if (y<) {add(i+n+p,TT,-y); total+=-y;}
} add(TT,T,total); rep(i,,p)
{
string s; cin>>people_name[i]>>s>>s;
if (s[s.length()-]==',') s.erase(s.end()-);
cin.get(ch);
if (ch=='\n') continue;
string t; cin>>t;
for (;;)
{
int x; cin>>x>>t;
if (t[t.length()-]==',')
{
t.erase(t.end()-);
people_has[i][res_number[t]]=x;
}
else
{
people_has[i][res_number[t]]=x;
}
cin.get(ch);
//cout<<(int)ch<<endl;
if (cin.fail()) break;
if (ch=='\n') break;
}
rep(j,,n)
{
//cout<<"\t"<<j<<" "<<people_has[i][j]<<" "<<build_need[build_number[s]][j]<<endl;
int y=people_has[i][j]-build_need[build_number[s]][j];
if (y>) add(i+n,n+p+j,y);
if (y<) add(j,i+n,-y);
}
}
rep(i,,n) add(n+p+i,i,INF); int x=dinic(); #ifdef DEBUG
cout<<x<<" "<<total<<endl;
#endif
if (x==total) {solve(S,); cout<<"build "<<my_build<<endl;}
else cout<<"No way"<<endl;
}
codeforces gym 100357 J (网络流)的更多相关文章
- Codeforces gym 101343 J.Husam and the Broken Present 2【状压dp】
2017 JUST Programming Contest 2.0 题目链接:Codeforces gym 101343 J.Husam and the Broken Present 2 J. Hu ...
- Codeforces GYM 100876 J - Buying roads 题解
Codeforces GYM 100876 J - Buying roads 题解 才不是因为有了图床来测试一下呢,哼( 题意 给你\(N\)个点,\(M\)条带权边的无向图,选出\(K\)条边,使得 ...
- codeforces Gym 100187J J. Deck Shuffling dfs
J. Deck Shuffling Time Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/pro ...
- codeforces GYM 100114 J. Computer Network 无相图缩点+树的直径
题目链接: http://codeforces.com/gym/100114 Description The computer network of “Plunder & Flee Inc.” ...
- codeforces Gym 100500 J. Bye Bye Russia
Problem J. Bye Bye RussiaTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/1005 ...
- codeforces GYM 100114 J. Computer Network tarjan 树的直径 缩点
J. Computer Network Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Des ...
- codeforces gym 100947 J. Killing everything dp+二分
J. Killing everything time limit per test 4 seconds memory limit per test 64 megabytes input standar ...
- codeforces gym 100357 H (DP 高精度)
题目大意 有r*s张扑克牌,数字从1到 r,每种数字有s种颜色. 询问对于所有随机的d张牌,能选出c张组成顺子的概率和组成同花的概率. 解题分析 对于组成顺子的概率,令dp[i][j][k]表示一共选 ...
- codeforces gym 100357 K (表达式 模拟)
题目大意 将一个含有+,-,^,()的表达式按照运算顺序转换成树状的形式. 解题分析 用递归的方式来处理表达式,首先直接去掉两边的括号(如果不止一对全部去光),然后找出不在括号内且优先级最低的符号.如 ...
随机推荐
- 说说Charles
本文来源 https://blog.csdn.net/Aaroun/article/details/79109917 今天,给大家做一次分享,主要面向移动端测试,介绍了我平时接口开发工作中用到的功能. ...
- 乐搏讲自动化测试-python语言特点及优缺点(5)
相信小伙伴们都知道,随着软件测试行业的发展和进步自动化测试已经成为必然.在竞争日益激烈的市场环境中也是你升职加薪的利器. 所以,小编决定从今天起!将要系统.连续.高质量的持续更新「整套自动化测试」文章 ...
- linux 定义变量 ,添加变量值
1.设置值$name=test2. 输出变量的值 echo $echo $name3. 增加变量内容PATH=$PATH:/home/bin/testPATH="$PATH":/h ...
- linux学习之路1 Linux系统安装
VMware workstation虚拟器 网上下载VMware workstation,然后安装任一系统的linux系统,不过选的系统一定要跟你下载好的linux镜像保持一致,博主装的是Red Ha ...
- TensorFlow---image recognition--classify_image运行、文件说明与错误(路径)解决
tutorial系列mnist已经玩过了,这篇玩一下 classify_image,其实就是image label.模型已经训练好的了,直接下载下来在.pb文件中. 本机环境: Win10 + Pyt ...
- poj1778 All Discs Considered
思路: 拓扑排序.贪心. 实现: #include <bits/stdc++.h> using namespace std; vector<]; int n1, n2; inline ...
- python自动化--mock、webservice及webdriver模拟手机浏览器
一.mock实现 自定义一个类,用来模拟未完成部分的开发代码 class Say(): def say_hello(self): pass 自定义返回值 import unittest from un ...
- 【C++】智能指针简述(六):智能指针总结及补充
本文我们主要来总结一下前文介绍过的智能指针相关原理及实现,顺便补充一下前文未提到的shared_ptr删除器部分的内容. 总结: 1.智能指针,通过RAII机制,构造对象时完成资源的初始化,析构对象时 ...
- CommHelper
18位流水号: public static string GenerateTransId(int i) { string transId = DateTime.Now.ToString("y ...
- Linux系统调用--getrusage函数详解
Linux系统调用--getrusage函数详解 功能描述: 获得进程的相关资源信息.如:用户开销时间,系统开销时间,接收的信号量等等; 用法: #include <sys/t ...