题目链接

bz似乎挂了...

luogu P3305 [SDOI2013]费用流

题解

dalao告诉我,这题

似乎很水....

懂了题目大意就可以随便切了

问1,最大流

问2,二分最大边权求,check是否为最大流

PS:今天代码很多bug....惨orz

代码

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 0x7fffffff
#define eps 1e-4
const int maxn = 5007;
using std::queue;
using std::min;
int n,m,S,T; inline int read() {
int x = 0,f = 1;
char c = getchar();
while(c < '0' || c > '9') {if(f == '-') f = -1;c = getchar();}
while(c <= '9'&&c >= '0') x = x * 10 + c - '0',c = getchar();
return x*f;
}
struct node{
int v;double flow;int next;
}edge[maxn<<2];
int head[maxn],num=1;
inline void add_edge(int u,int v,double flow) { edge[++num].v = v;edge[num].flow = flow;edge[num].next = head[u];head[u] = num; }
inline void ADD (int u,int v,double flow) {
add_edge(u,v,flow);
add_edge(v,u,0);
}
int a[maxn],b[maxn];double c[maxn];int lev[maxn],cur[maxn];
bool bfs() {
for(int i = 0;i <= n;++ i) lev[i] = -1,cur[i] = head[i];
queue<int>q;q.push(S),lev[S] = 0;
while(!q.empty()) {
int u = q.front();q.pop();
for(int i = head[u];i;i = edge[i].next) {
int v = edge[i].v;
if(lev[v] == -1&&edge[i].flow > 0)
lev[v] = lev[u]+1,q.push(v);
}
}
if(lev[T] != -1)return true;
return false;
}
double dfs(int x,double flow) {
if(x == T)return flow;
double delta,rest = 0;
for(int v,&i = cur[x];i;i = edge[i].next) {
v = edge[i].v;
if(lev[v] == lev[x]+1&&edge[i].flow > 0) {
delta = dfs(v,std::min(flow - rest,edge[i].flow));
if(delta) {
edge[i].flow -= delta;
edge[i^1].flow += delta;
rest+=delta;if(rest == delta)break;
}
}
}
if(rest==flow) lev[x]=-1;
return rest;
} double Dinic() {
double ret = 0;
while(bfs())
ret += dfs(S,INF);
return ret;
}
void rebuild(double mid) {
memset(head,0,sizeof head);
num=1;
for(int i = 1;i <= m;++ i) {
ADD(a[i],b[i],min(mid,c[i]));
}
}
int main() {
double p;
n = read(),m = read(),scanf("%lf",&p);
S=1;T=n;
for (int i = 1;i <= m;++ i) scanf("%d%d%lf",&a[i],&b[i],&c[i]), ADD(a[i],b[i],c[i]);
double Max_flow;
Max_flow = Dinic();
printf("%.0lf\n",Max_flow);
double l = 0,r = 1000000086.0;
while (r - l > eps) {
double mid = (l + r) / 2;
rebuild(mid);
if(Dinic() != Max_flow) l = mid;
else r = mid;
}
printf("%.4lf\n",l*p);
return 0;
}

最新文章

  1. Xamarin Android 绑定jar库同时将so库打包进去
  2. 关于JAVA堆栈的简单说明
  3. SQL server数据类型、增删改查
  4. emacs配置详解及C/C++IDE全功能配置演示(附配置文件)
  5. iptables 配置需要保存
  6. JavaHTTP下载视频
  7. vue搭建项目前奏曲——vue-cli
  8. Assigning Workstations
  9. oracle设置自动增长序列
  10. PCI和PCIE插槽有什么区别?
  11. Axure RP初学2
  12. WSGI及gunicorn指北(二)
  13. js作用域和内存
  14. 第六节,Neural Networks and Deep Learning 一书小节(下)
  15. Python新手入门英文词汇笔记(转)
  16. IDEA中自动生成serialVersionUID
  17. mysql操作类
  18. Java——多线程常见面试题
  19. IntelliJ IDEA使用心得之问题篇;
  20. Cpp下匿名对象探究

热门文章

  1. C++——OOP面向对象理解
  2. [hdu 3068] Manacher算法O(n)最长回文子串
  3. Saruman’s Level Up~(多校赛算组合数)
  4. nodejs 喜欢报cannot find module .....的简单解决方案
  5. MFC 对话框透明效果
  6. AngularJs学习——模拟用户登录的简单操作
  7. HDU1267 下沙的沙子有几粒? 基础DP
  8. 之江学院第0届校赛 qwb与支教 (容斥公式)
  9. bzoj 1942 斜率优化DP
  10. algorithm ch15 FastWay