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 (表达式 模拟)
题目大意 将一个含有+,-,^,()的表达式按照运算顺序转换成树状的形式. 解题分析 用递归的方式来处理表达式,首先直接去掉两边的括号(如果不止一对全部去光),然后找出不在括号内且优先级最低的符号.如 ...
随机推荐
- extjs grid禁止表格头部使用鼠标拖拽改变宽度
extjs6 经典版 表格头部使用鼠标拖动 禁止改变列的宽度 只需要给grid 设置属性enableColumnResize:false就可以啦 xtype:'grid', enableColumnR ...
- Hadoop回收站及fs.trash参数详解
前言: Linux系统里,个人觉得最大的不方便之一就是没有回收站的概念.rm -rf很容易造成极大的损失.而在Hadoop或者说HDFS里面,有trash(回收站)的概念,可以使得数据被误删以后,还可 ...
- 375 Guess Number Higher or Lower II 猜数字大小 II
我们正在玩一个猜数游戏,游戏规则如下:我从 1 到 n 之间选择一个数字,你来猜我选了哪个数字.每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了.然而,当你猜了数字 x 并且猜错了的时候,你需 ...
- json常识
转载网址:http://developer.51cto.com/art/201704/536386.htm 我们先来看一个JS中常见的JS对象序列化成JSON字符串的问题. 请问:以下JS对象通过 ...
- [ SDOI 2006 ] 保安站岗
\(\\\) Description 给出一棵 \(n\) 个节点以 \(1\) 为根的树,一个节点的覆盖半径是 \(1\) ,点有点权 \(val_x\) . 选择一些点,使得点权和最小,同时每个节 ...
- Android中出现Error:In (declare-styleable) FontFamilyFont, unable to find attribute android:font
Android中出现Error:In (declare-styleable) FontFamilyFont, unable to find attribute android:font 解决办法,今天 ...
- C语言常见问题总结
1.多次运行程序 解决方法: 错误原因是,已经编译运行出一个exe,没有关闭此exe,又点击编译运行. 应该将之前运行出的exe关闭,再来运行代码 2.单精度类型和双精度类型如何区分使用... 解决方 ...
- mongo 3.4分片集群系列之五:详解平衡器
这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...
- Codeforces_750_C_(二分查找)
C. New Year and Rating time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- HDU_1789_doing homework again_贪心
Doing Homework again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...