网络流的题好难。。感觉有点遭不住了

这题用矩阵存图,然后把k个物品,每个物品都求一次费用流

/*
多源多汇的费用流
其实是k个费用流
*/
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define maxn 205
struct Edge{int to,nxt,w,c;}e[maxn<<];
int head[maxn],tot,n,m,s,t;
void init(){}
void add(int u,int v,int w,int c){} int sum_need[maxn],sum_offer[maxn];
int offer[maxn][maxn],need[maxn][maxn],mp[maxn][maxn],cost[maxn][maxn],K,sum,pre[maxn]; int dis[maxn],vis[maxn];
int spfa(){
queue<int>q;
for(int i=;i<=t;i++){vis[i]=false;dis[i]=inf;} vis[s]=;dis[s]=;q.push(s);
while(!q.empty()){
int k=q.front();q.pop();vis[k]=false;
for(int i=;i<=t;i++)
if(mp[k][i] && dis[i]>dis[k]+cost[k][i]){
dis[i]=dis[k]+cost[k][i];
pre[i]=k;
if(!vis[i]){
vis[i]=;
q.push(i);
}
}
} if(dis[t]!=inf)return ;
return ;
}
int fond(){
int Min=inf,res=;
while(spfa()){
for(int i=t;i!=s;i=pre[i])
Min=min(Min,mp[pre[i]][i]);
for(int i=t;i!=s;i=pre[i]){
mp[pre[i]][i]-=Min;
mp[i][pre[i]]+=Min;
res+=cost[pre[i]][i]*Min;
}
}
return res;
} int main(){
while(cin>>n>>m>>K,n&&m&&K){
sum=;
memset(sum_need,,sizeof sum_need);
memset(sum_offer,,sizeof sum_offer); for(int i=;i<=n;i++)
for(int j=;j<=K;j++){
scanf("%d",&need[i][j]);
sum_need[j]+=need[i][j];
}
for(int i=;i<=m;i++)
for(int j=;j<=K;j++){
scanf("%d",&offer[i][j]);
sum_offer[j]+=offer[i][j];
}
int sign=;
for(int i=;i<=K;i++)
if(sum_offer[i]<sum_need[i]){
sign=;
break;
}
s=;
t=n+m+;
for(int k=;k<=K;k++){
memset(mp,,sizeof mp);
memset(cost,,sizeof cost);
//第k件物品 供应商->店主的运费
for(int i=+m;i<=n+m;i++)
for(int j=;j<=m;j++){
scanf("%d",&cost[j][i]);
cost[i][j]-=cost[j][i];//反向边的费用
} if(sign==)continue; for(int i=;i<=m;i++)//s->供应商
mp[s][i]=offer[i][k];
for(int i=;i<=m;i++)//供应商->店主
for(int j=m+;j<=m+n;j++)
mp[i][j]=offer[i][k];
for(int i=m+;i<=m+n;i++)//店主->t
mp[i][t]=need[i-m][k];
sum+=fond();
}
if(sign==)
printf("-1\n");
else printf("%d\n",sum);
}
}

多源多汇费用流——poj2516的更多相关文章

  1. Spark Streaming源码解读之流数据不断接收全生命周期彻底研究和思考

    本期内容 : 数据接收架构设计模式 数据接收源码彻底研究 一.Spark Streaming数据接收设计模式   Spark Streaming接收数据也相似MVC架构: 1. Mode相当于Rece ...

  2. poj 1459 多源多汇点最大流

    Sample Input 2 1 1 2 (0,1)20 (1,0)10 (0)15 (1)20 7 2 3 13 (0,0)1 (0,1)2 (0,2)5 (1,0)1 (1,2)8 (2,3)1 ...

  3. .27-浅析webpack源码之事件流make(2)

    上一节跑到了NormalModuleFactory模块,调用了原型方法create后,依次触发了before-rsolve.factory.resolver事件流,这节从resolver事件流开始讲. ...

  4. .26-浅析webpack源码之事件流make(1)

    compilation事件流中,依然只是针对细节步骤做事件流注入,代码流程如图: // apply => this-compilation // apply => compilation ...

  5. .24-浅析webpack源码之事件流compilation(2)

    下一个compilation来源于以下代码: compiler.apply(new EntryOptionPlugin()); compiler.applyPluginsBailResult(&quo ...

  6. .23-浅析webpack源码之事件流compilation(1)

    正式开始跑编译,依次解析,首先是: compiler.apply( new JsonpTemplatePlugin(options.output), // start new FunctionModu ...

  7. .22-浅析webpack源码之事件流compilation总览

    呃,终于到了这地方-- newCompilation(params) { // ... this.applyPlugins("this-compilation", compilat ...

  8. .21-浅析webpack源码之事件流this-compilation

    上一节生成Compilation实例后,添加了一些属性,随后触发this-compilation事件流,如下: Compiler.prototype.newCompilation = (params) ...

  9. .34-浅析webpack源码之事件流make(3)

    新年好呀~过个年光打游戏,function都写不顺溜了. 上一节的代码到这里了: // NormalModuleFactory的resolver事件流 this.plugin("resolv ...

随机推荐

  1. sql ibatis

    <!-- 写入单位下当前参保人员 --> <insert id="insertTempCaz043" parameterClass="map" ...

  2. createBottomTabNavigator: 怎么在切换tab的时候让页面重新渲染

    1.import withNavigationFocus from react-navigation to your class . 2.hen export your like this : exp ...

  3. wget 下载文件

    # -c 继续执行上次终端的任务# --http-user http用户名# --http-passwd http密码# --no-check-certificate 不检查ssl/tsl证书. wg ...

  4. leetcode-三角形的最大周长

    Python解法: class Solution: def largestPerimeter(self, A: List[int]) -> int: A.sort() for i in rang ...

  5. Java初识方法

    5.初识方法 方法就是一段代码片段,这个片段可以完成特定的功能,并且可以重复利用. 5.1 方法的定义 5.1.1方法的定义格式 [方法修饰列表] 返回值类型 方法名(方法参数列表){ 方法体 } ① ...

  6. JS For 循环详解;棋盘放粮食 64;冒泡排序实例

    FOR( 初始条件:循环条件:状态改变:) { 被执行的代码块} 初始条件: 在循环(代码块)开始前执行 循环条件:定义运行循环(代码块)的条件 状态改变: 在循环(代码块)已被执行之后执行 循环可以 ...

  7. 「题解」:07.16NOIP模拟T2:通讯

    问题 B: 通讯 时间限制: 1 Sec  内存限制: 256 MB 题面 题目描述 “这一切都是命运石之门的选择.” 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此 ...

  8. 排列+函数映射——hdu6038好题

    /* 引理:[0,n-1]的排列,i向a[i]连边,那么每个数必定在一个环中 所以数组a可以分割成一些环,数组b也可以分割成一些环 先讨论a的一个环 a[a1]=a2 a[a2]=a3 a[a3]=a ...

  9. (转)Java 标注(Annotation)详解

    转:http://blog.csdn.net/nbrremix/article/details/7337274 元数据的作用 如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所 ...

  10. Qt无边框窗口的移动、拉伸边框、鼠标滚轮缩放大小

    主要是处理窗口上鼠标的几个事件,具体代码请看下面的截图, 完整代码的下载链接在此:http://download.csdn.net/detail/beyond0824/9657110, 本示例代码中, ...