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 (表达式 模拟)
题目大意 将一个含有+,-,^,()的表达式按照运算顺序转换成树状的形式. 解题分析 用递归的方式来处理表达式,首先直接去掉两边的括号(如果不止一对全部去光),然后找出不在括号内且优先级最低的符号.如 ...
随机推荐
- HTML和JSP的不同及优缺点
HTML(Hypertext Markup Language)文本标记语言,它是静态页面,和JavaScript一样解释性语言,为什么说是解释性语言呢?因为,只要你有一个浏览器那么它就可以正常显示出来 ...
- hdu5924Mr. Frog’s Problem
Mr. Frog's Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- 406 Queue Reconstruction by Height 根据身高重建队列
假设有打乱顺序的一群人站成一个队列. 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数. 编写一个算法来重建这个队列.注意:总人数少于1100人.示 ...
- 242 Valid Anagram 有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词.例如,s = "anagram",t = "nagaram",返回 true ...
- Focusky的下载、安装、注册和使用(动画演示大师)
一.下载 二.安装 三.使用 四.注册 五.附录 非常感谢Focusky官方团队开发并提供实用的这么一款软件!!! 一.下载 http://www.focusky.com.cn/ 二.安装 三.使用 ...
- Spring与Struts2集成开发
Struts2和Spring都是不错的开源框架,Spring与Struts2集成开发,把二者结合在一起使用,开发效果更佳,效率杠杠的.下面介绍一下如何将Spring与Struts2集成在一起开发.分七 ...
- 3星|《未来公司》:Uber简史
未来公司(卡兰尼克和他的Uber帝国)(精) 从Uber创始人卡兰尼克的角度讲的Uber简史,截止到2017年.书中有不少Uber的负面新闻,比国内的同类书要好. 基本是流水账.想了解这家公司的历史, ...
- 隐藏win10任务栏输入法M图标
在任务栏右键=>任务栏设置=>打开或关闭系统图标=>(关闭)输入指示
- js获取图片信息(一)-----获取图片的原始尺寸
如何获取图片的原始尺寸大小? 如下,当给 img 设置一个固定的大小时,要怎样获取图片的原始尺寸呢? #oImg{ width: 100px; height: 100px; } <img src ...
- ThinkPHP---ue编辑器
[一]简介 (1)介绍 一款百度开发的JS插件 ue编辑器,全称Ueditor(翻译为你的编辑器),百度开发的在线编辑器,是一款在线编辑器软件,在线编辑器又称为“富文本编辑器”. 国外也有一款类似的编 ...