题目链接:点击查看

题目大意:给出一张有向图,每条边都有单独的花费,现在给出 q 次询问,每次询问给出一个 u 和 v 需要回答:将所有边的流量都设置为 u / v 后,从点 1 到点 n 流量为 1 时的最小花费为多少

题目分析:因为询问非常多,肯定不能对于每次询问重新建边,但因为总的边数非常小,所以我们利用等比例的特性,初始时先将每条边的流量都设置为 1 ,在求最小费用最大流的时候,记录一下每个流量下的最小花费,这样对于每次询问,就可以贪心求解了

因为初始时每条边的流量为 1 ,每次询问时每条边的流量为 u / v ,每次询问时的总流量为 1 ,设初始时对应的流量为 x ,根据比例公式不难求解出需要在初始的图中使用 v / u 的流量进行对应,贪心的话选前 v / u 的流量所对应的权值和就好了

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=210;vector<LL>node,sum;struct Edge
{int to,w,cost,next;
}edge[N*N];int head[N],cnt;void addedge(int u,int v,int w,int cost)
{edge[cnt].to=v;edge[cnt].w=w;edge[cnt].cost=cost;edge[cnt].next=head[u];head[u]=cnt++;edge[cnt].to=u;edge[cnt].w=0;edge[cnt].cost=-cost;edge[cnt].next=head[v];head[v]=cnt++;
}int d[N],incf[N],pre[N];bool vis[N];bool spfa(int s,int t)
{memset(d,inf,sizeof(d));memset(vis,false,sizeof(vis));memset(pre,-1,sizeof(pre));queue<int>q;q.push(s);vis[s]=true;incf[s]=inf;d[s]=0;while(!q.empty()){int u=q.front();q.pop();vis[u]=false;for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;int cost=edge[i].cost;if(!w)continue;if(d[v]>d[u]+cost){d[v]=d[u]+cost;pre[v]=i;incf[v]=min(incf[u],w);if(!vis[v]){vis[v]=true;q.push(v);}}}}return pre[t]!=-1;
}int update(int s,int t)
{int x=t;while(x!=s){int i=pre[x];edge[i].w-=incf[t];edge[i^1].w+=incf[t];node.back()+=edge[i].cost;x=edge[i^1].to;}return d[t]*incf[t];
}void init()
{node.clear();sum.clear();memset(head,-1,sizeof(head));cnt=0;
}int solve(int st,int ed)
{int ans=0;while(spfa(st,ed)){node.push_back(0);update(st,ed);ans++;}return ans;
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int n,m,st=N-1,ed=st-1;while(scanf("%d%d",&n,&m)!=EOF){init();while(m--){int u,v,c;scanf("%d%d%d",&u,&v,&c);addedge(u,v,1,c);}addedge(st,1,inf,0);addedge(n,ed,inf,0);int max_flow=solve(st,ed);sum.push_back(0);for(int i=0;i<node.size();i++)sum.push_back(sum.back()+node[i]);int q;scanf("%d",&q);while(q--){LL u,v;scanf("%lld%lld",&u,&v);if(u*max_flow<v){puts("NaN");continue;}int j=v/u;LL ans1=sum[j]*u+(sum[j+1]-sum[j])*(v-j*u);LL ans2=v;LL gcd=__gcd(ans1,ans2);ans1/=gcd;ans2/=gcd;printf("%lld/%lld\n",ans1,ans2);}}return 0;
}

牛客多校 - Minimum-cost Flow(最小费用最大流+贪心)相关推荐

  1. POJ 2516 -- Minimum Cost (最小费用最大流, 必须分开建图)

    题目链接 Description Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In ...

  2. 最小费用最大流 【模板】

    如果理解了最大流连续增广路算法的思维, 理解这个算法还是很简单的. 结构体存储信息: 分别为边的起点.终点.容量.当前流量.费用.下一条边的编号. struct Edge {int from, to, ...

  3. [2020牛客多校第一场]Coda的题解集

    被暴打了. 会先写比赛中过题数100+的题目,其他的以后再补. 施工中,未完待续- F Infinite String Comparision 一开始想到的是对比到lcm(|a|,|b|),意料之中T ...

  4. 【2020暑假牛客多校(一)】

    牛客多校 Home AC:2,rank517AC : 2, rank517AC:2,rank517 7.127.127.12 题单 F(1271/5027)F(1271/5027)F(1271/502 ...

  5. 2020 牛客多校第一场

    2020 牛客多校第一场 A. B-Suffix Array 后缀数组的思想:倍增+桶排序的方式找出一串连续序列后缀的大小.虽说正常使用的时候都是字典序,但是只要修改排序方式,也能够达到一个类似的&q ...

  6. python字符串去重及排序 牛客_2018牛客多校第一场 D.Two Graphs

    题意: n个点,m1条边的图E1,n个点,m2条边的图E2.求图E2有多少子图跟图E1同构. 题解: 用STL的全排列函数next_permutation()枚举映射.对于每一种映射枚举每一条边判断合 ...

  7. 牛客多校三 B Black and white

    牛客多校三 B Black and white 在n*m的棋盘上,每个格子有一个数,初始可以选一定的格子标记为黑色,在任意四个形如(i1, j1)(i1, j2)(i2, j1)(i2, j2)的格子 ...

  8. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  9. POJ - 2516 Minimum Cost 最小费用最大流

    题目链接 题意:给n,m,k表示商店数,储存店数,种类数 然后给n*k表示每个水果店需求每种种类的数量: 表示成 need[i][j] 再给m*k表示每个储存店每种种类数量: 表示成store[i][ ...

最新文章

  1. Ubuntu 16.04 安装 Docker - Dependency failed for Docker Application Container
  2. Android 5.0新特性ToolBar
  3. 《赢道:成功创业者的28条戒律》成都签售会魅力登场(背景)
  4. Android自动化测试工具Appium环境搭建
  5. wordpress--SEO们的福音
  6. 可以编辑的标签控件CStatic
  7. 使用C#快速生成顺序GUID
  8. 双向链表逆置c语言,【C++】实现双向链表的所有操作,包括逆置双链表(三种方法)...
  9. 价值98元的千神资源网模板
  10. window.location和window.open的区别
  11. 设计模式在项目中的应用案例_项目化学习案例(五):菊花种植的秘密——项目化学习在菊种植课程中的应用设计案例...
  12. Spring AOP之注解配置篇
  13. 使用el-checkbox实现全选,点击失效没有反应 1
  14. 正则判断手机号地区_匹配中国大陆所有手机号正则表达式
  15. 错误:Cannot construct instance of `xxxx` (no Creators, like default construct , exist): cannot .......
  16. 美团餐饮娱乐知识图谱——美团大脑揭秘
  17. 同源策略、跨域以及跨域的三种解决方案详解
  18. 虚拟服务器传文件,虚拟机与主机传输文件
  19. IBM powerVC云管平台
  20. python爬漫画(1)—— 如何爬取简单静态网页的图片

热门文章

  1. 从源码剖析SpringBoot中Tomcat的默认最大连接数
  2. mybatis反射的核心类
  3. Java 网关-Servlet Gateway
  4. 思考如何保证线程并行的数据安全性
  5. Predicate接口练习之筛选满足条件数据
  6. 分页和条件查询接口开发
  7. request获取中文乱码的问题
  8. Hive的基本操作-基本查询语法
  9. 日志规范之为什么要使用SLF4J
  10. 工程搭建:搭建子工程之分布式id生成器