题目大意

  有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 (网络流)的更多相关文章

  1. 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 ...

  2. Codeforces GYM 100876 J - Buying roads 题解

    Codeforces GYM 100876 J - Buying roads 题解 才不是因为有了图床来测试一下呢,哼( 题意 给你\(N\)个点,\(M\)条带权边的无向图,选出\(K\)条边,使得 ...

  3. codeforces Gym 100187J J. Deck Shuffling dfs

    J. Deck Shuffling Time Limit: 2   Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/pro ...

  4. codeforces GYM 100114 J. Computer Network 无相图缩点+树的直径

    题目链接: http://codeforces.com/gym/100114 Description The computer network of “Plunder & Flee Inc.” ...

  5. codeforces Gym 100500 J. Bye Bye Russia

    Problem J. Bye Bye RussiaTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/1005 ...

  6. codeforces GYM 100114 J. Computer Network tarjan 树的直径 缩点

    J. Computer Network Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Des ...

  7. codeforces gym 100947 J. Killing everything dp+二分

    J. Killing everything time limit per test 4 seconds memory limit per test 64 megabytes input standar ...

  8. codeforces gym 100357 H (DP 高精度)

    题目大意 有r*s张扑克牌,数字从1到 r,每种数字有s种颜色. 询问对于所有随机的d张牌,能选出c张组成顺子的概率和组成同花的概率. 解题分析 对于组成顺子的概率,令dp[i][j][k]表示一共选 ...

  9. codeforces gym 100357 K (表达式 模拟)

    题目大意 将一个含有+,-,^,()的表达式按照运算顺序转换成树状的形式. 解题分析 用递归的方式来处理表达式,首先直接去掉两边的括号(如果不止一对全部去光),然后找出不在括号内且优先级最低的符号.如 ...

随机推荐

  1. array_column() 函数[二维数组转为一维数组]

    array_column() 函数 输出数组中某个键值的集合[二维数组转为一位数组] <?php // 表示由数据库返回的可能记录集的数组 $a = array( array( 'id' =&g ...

  2. C#命名空间 using的用法

    using的用法: 1. using指令:引入命名空间 这是最常见的用法,例如: using System; using Namespace1.SubNameSpace; 2. using stati ...

  3. DP BestCoder Round #50 (div.2) 1003 The mook jong

    题目传送门 /* DP:这题赤裸裸的dp,dp[i][1/0]表示第i块板放木桩和不放木桩的方案数.状态转移方程: dp[i][1] = dp[i-3][1] + dp[i-3][0] + 1; dp ...

  4. ActiveMQ命令行工具

    命令行工具 命令行工具 n        activemq——运行activemq代理 n activemq-admin——管理代理的实例 在5.0之前activemq-admin被分成多个脚本,例如 ...

  5. (四)Mybatis总结之接口映射

    前面Mybatis是直接通过Dao层与数据交互,更好的方法是Mybatis通过接口映射方式与数据交互 1.在项目中添加maven支持(即pom.xml下添加支持) <!-- 在pom.xml下配 ...

  6. linux下jdk与tomcat的安装与配置

    Linux中jdk与tomcat的安装与配置 1.搭建环境: (1)Linux环境:CentOS6.1 (2)jdk-1.8 (3)tomcat-9.0 2.在Linux系统上创建目录 在usr/lo ...

  7. TOP5_3:定制简单的进度条

    结构: Activity: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xm ...

  8. Git——github高级

    分支管理 分支不是越多越好,只求一个稳定的分支,即master不要轻易去更改 对应master要有一个开发者分支,保证mater分支的稳定性 所有的功能都在开发者分支上进行 在所有功能开发后新建发布分 ...

  9. HDU6189 Law of Commutation (数论)

    题意:输入n和a 定义m等于2的n次方 求1-m有多少数使得 a^b = b^a (mod m) 题解:先打表找规律 发现a为奇数的答案只有b = a这一种 (不知道为什么也不想知道为什么 当a为偶数 ...

  10. 'dict' object is not callable

    今天学py的map函数时,由于在上面定义了一个dict类型的变量(取的名是map),所以编译后报了这么一个错,哎,以后学py命名要小心了