题目链接

  这题比较水,就是乱改改费用流模板。判断一下已经满流的边和没有满流的边,然后再改改最大流模板,然后把它们拼起来就是了。

  话说这题第一遍90,然后撕烤一会发现自己yy的spfa扩容方式不允许反悔。然后改了一个貌似没什么用的地方,结果A了……

  但是改的那个地方貌似是真的没什么用啊……

#include<cstdio>
#include<cstdlib>
#include<cctype>
#include<algorithm>
#include<cstring>
#include<queue>
#define maxn 2000
#define maxm 10000
using namespace std; inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} inline int count(int i){ return i&?i+:i-; } struct Edge{
int from,next,to,dis,val,flow;
}edge[maxm*];
int head[maxn],num;
inline void addedge(int from,int to,int dis,int val){
edge[++num]=(Edge){from,head[from],to,dis,val,};
head[from]=num;
}
inline void add(int from,int to,int dis,int val){
addedge(from,to,dis,val);
addedge(to,from,-dis,);
} int dfn[maxn];
bool vis[maxn];
int Start,End;
int list[maxn]; bool bfs(){
memset(vis,,sizeof(vis));
dfn[Start]=; vis[Start]=;
queue<int>q; q.push(Start);
while(!q.empty()){
int from=q.front();q.pop();
for(int i=head[from];i;i=edge[i].next){
int to=edge[i].to;
if(edge[i].val==edge[i].flow||vis[to]) continue;
vis[to]=;
dfn[to]=dfn[from]+; q.push(to);
}
}
return vis[End];
} int dfs(int x,int val){
if(x==End||val==) return val;
int flow=; vis[x]=;
for(int &i=list[x];i;i=edge[i].next){
int to=edge[i].to;
if(edge[i].val==edge[i].flow||vis[to]||dfn[to]!=dfn[x]+) continue;
int now=dfs(to,min(val,edge[i].val-edge[i].flow));
edge[i].flow+=now; edge[count(i)].flow-=now; val-=now; flow+=now;
if(val<=) break;
}
if(flow!=val) dfn[x]=-;
return flow;
} int dis[maxn];
int pre[maxn]; int spfa(){
memset(dis,/,sizeof(dis)); dis[Start]=;
memset(vis,,sizeof(vis));
queue<int>q; q.push(Start);
while(!q.empty()){ int from=q.front(); q.pop(); vis[from]=;
for(int i=head[from];i;i=edge[i].next){
int to=edge[i].to;
if(edge[i].val>edge[i].flow){
if(dis[to]<=dis[from]) continue;
dis[to]=dis[from];
}
else{
if(edge[i].dis<) continue;
if(dis[to]<=dis[from]+edge[i].dis) continue;
dis[to]=dis[from]+edge[i].dis;
}
pre[to]=i;
if(vis[to]) continue;
vis[to]=; q.push(to);
}
}
int now=End;
while(now!=Start&&now){
int ret=pre[now];
if(edge[ret].val==edge[ret].flow) edge[ret].val++;
edge[ret].flow++; edge[count(ret)].flow--;
now=edge[ret].from;
}
return dis[End];
} int main(){
int n=read(),m=read(),e=read();End=n;Start=;
for(int i=;i<=m;++i){
int a=read(),b=read(),c=read(),d=read();
add(a,b,d,c);
}
int ans=;
while(bfs()){
memset(vis,,sizeof(vis));
for(int i=;i<=n;++i) list[i]=head[i];
int now=dfs(Start,0x7fffffff);
if(!now) break;
ans+=now;
}
printf("%d",ans);
long long now=;
for(int i=;i<=e;++i)
now+=spfa();
printf(" %lld",now);
return ;
}

最新文章

  1. SpringMVC+Shiro权限管理【转】
  2. js 中关联数组
  3. 学习篇:TypeCodes的2015年博客升级记
  4. CentOS 7.0,启用iptables防火墙
  5. NoSQl简介(转)
  6. python中的浅拷贝和深拷贝
  7. codeforces CF475 ABC 题解
  8. 【apache】yum 安装Apache(Centos 6.5)
  9. Linux I2C总线设备驱动模型分析(ov7740)
  10. httpsclient 自动获取证书 无证书访问 验证过能直接用
  11. codeforce 606C - Sorting Railway Cars
  12. javascript 原型 和 原型链
  13. (升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)
  14. MAC OSX 进程间通信
  15. Winpcap网络编程十之Winpcap实战,两台主机通过中间主机通信
  16. bash脚本退出代码解释
  17. 北京赛车PK10 幸运飞艇 重庆时时彩 PC蛋蛋 快乐8 福彩3D 十分彩
  18. Android监测手指上下左右滑动屏幕
  19. Svn基本操作
  20. HTML响应式布局实现详解

热门文章

  1. UVA225 Golygons 黄金图形(dfs+回溯)
  2. [学习笔记] C++ 历年试题解析(一)--判断题
  3. [课堂总结]C++课堂总结(二)
  4. 在DataGridView控件中显示下拉列表
  5. iOS开发-动画总结
  6. Where do I belong-freecodecamp算法题目
  7. Protobuf有没有比JSON快5倍?用代码来击破pb性能神话
  8. centos里没有pip命令怎么办?
  9. 第一本C语言笔记(上)
  10. mybatis枚举类型处理器