博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 3686 The Windy\'s 最小费用流 建图 16_05_14
阅读量:4114 次
发布时间:2019-05-25

本文共 2027 字,大约阅读时间需要 6 分钟。

题意:有n件玩具交给m个工厂加工,每个工厂加工每个玩具的时间不一样,且一个工厂一个时刻只能加工一个玩具
求加工完所有工具的最小的平均时间;
#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std; #define MM(a) memset(a,0,sizeof(a)) typedef long long ll; typedef unsigned long long ULL; const int mod = 1000000007; const double eps = 1e-10; const int inf = 0x3f3f3f3f; const int big=50000; int max(int a,int b) {return a>b?a:b;}; int min(int a,int b) {return a
G[3000]; int w[55][3000],dist[3000],inq[3000],prel[3000],prev[3000]; int n,m,x,y,c; void add_edge(int u,int v,int cap,int cost) { G[u].push_back(edge{v,cap,cost,G[v].size()}); G[v].push_back(edge{u,0,-cost,G[u].size()-1}); } int mcost(int s,int t,int f) { int mincost=0; while(f>0) { memset(dist,inf,sizeof(dist)); memset(inq,0,sizeof(inq)); dist[s]=0; queue
q; q.push(s); inq[s]=1; while(!q.empty()) { int u=q.front(); q.pop(); inq[u]=0; //printf("///\n"); //cout<
<
0&&dist[e.to]>dist[u]+e.cost) { dist[e.to]=dist[u]+e.cost; prev[e.to]=u; prel[e.to]=j; if(!inq[e.to]) { q.push(e.to); inq[e.to]=1; } } } } int minn=inf; for(int i=t;i>s;) { int f=prev[i]; int j=prel[i]; minn=min(minn,G[f][j].cap); i=prev[i]; } for(int i=t;i>s;) { int f=prev[i]; int j=prel[i]; G[f][j].cap-=minn; G[i][G[f][j].rev].cap+=minn; mincost+=G[f][j].cost; i=prev[i]; } f-=minn; } // cout<
<<"hhahhaha"<
>cas; while(cas--) { scanf("%d %d",&n,&m); int s=0,t=n+n*m+1; memset(w,0,sizeof(w)); for(int i=s;i<=t;i++) G[i].clear(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&w[i][j]); for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) add_edge(k,i*n+j,1,w[k][i]*j); for(int i=1;i<=n;i++) add_edge(s,i,1,0); for(int j=n+1;j<=n+n*m;j++) add_edge(j,t,1,0); printf("%.6f\n",((double)mcost(s,t,n))/n); } return 0; }

分析:这道题目最难的地方就在于构图,刚开始想的是构建一个时间和工厂的二元组,但是后来

发现是行不通的,因为加工玩具的时间的又依赖性的;  但是我们发现一个工厂加工倒数第k个玩具时

加工这个玩具的总的耗费时间是k*(该工厂单独加工这个玩具的时间),由此相出根据加工次序构图,

然后最小费用流求解即可。

转载地址:http://ytgsi.baihongyu.com/

你可能感兴趣的文章
EntityFramework 学习之一 —— 模型概述与环境搭建 .
查看>>
C# 发HTTP请求
查看>>
启动 LocalDB 和连接到 LocalDB
查看>>
Palindrome Number --回文整数
查看>>
Reverse Integer--反转整数
查看>>
Container With Most Water --装最多水的容器(重)
查看>>
Longest Common Prefix -最长公共前缀
查看>>
Letter Combinations of a Phone Number
查看>>
Single Number II --出现一次的数(重)
查看>>
Valid Parentheses --括号匹配
查看>>
Remove Element--原地移除重复元素
查看>>
Remove Duplicates from Sorted Array--从有序数组中移除重复元素
查看>>
Count and Say
查看>>
Gas Station
查看>>
Palindrome Partitioning --回文切割 深搜(重重)
查看>>
Valid Palindrome 简单的回文判断
查看>>
Pascal's Triangle -- 生成杨辉三角
查看>>
Pascal's Triangle II 生成杨辉三角中的某行
查看>>
Minimum Depth of Binary Tree -- 二叉树的最小深度 DFS 加剪枝
查看>>
Climbing Stairs 爬楼梯方法 动态规划
查看>>