博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
晨跑【最小费用最大流】
阅读量:6495 次
发布时间:2019-06-24

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

题目:

解题思路:

建图:把除了源点和汇点的其它路口拆成两个点,入点和出点,两点之间边最大流量为1,费用为0,其他流量为inf,费用为长度:

源程序:

#include
#include
#define inf 1e9#define min(a,b) a>b?b:ausing namespace std;struct node{ int x,y,c,f,next;}e[100001];int last[5001],d[5001],v[5001],pre[5001],ans,sum,n,m,s,t,cnt=-1;void add(int u,int v,int c,int f){ e[++cnt].x=u;e[cnt].y=v;e[cnt].c=c;e[cnt].f=f;e[cnt].next=last[u];last[u]=cnt; e[++cnt].x=v;e[cnt].y=u;e[cnt].c=0;e[cnt].f=-f;e[cnt].next=last[v];last[v]=cnt;} bool spfa(){ for (int i=1;i<=2*n+2;i++) d[i]=inf,v[i]=0; queue
q; q.push(s);d[s]=0;v[s]=1; while (q.size()) { int u=q.front(); q.pop(); v[u]=0; for (int i=last[u];~i;i=e[i].next) if (e[i].c&&d[e[i].y]>d[u]+e[i].f) { d[e[i].y]=d[u]+e[i].f; pre[e[i].y]=i; if (!v[e[i].y]) { v[e[i].y]=1; q.push(e[i].y); } } } return d[t]!=inf;}void mcf(){ int minn=inf,p=t; while(~pre[p]) { minn=min(e[pre[p]].c,minn); p=e[pre[p]].x; } ans+=minn;sum+=d[t]*minn; p=t; while(~pre[p]) { e[pre[p]].c-=minn; e[pre[p]^1].c+=minn; p=e[pre[p]].x; } return;}int main(){ for (int i=0;i<=500;i++) last[i]=pre[i]=-1; scanf("%d%d",&n,&m); s=2*n+1;t=2*n+2; for (int i=1;i<=m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); if (a==1&&b!=n) add(s,b*2-1,1,c); else if (a!=1&&b==n) add(a*2,t,1,c); else if (a==1&&b==n) add(s,t,1,c); else add(a*2,b*2-1,1,c); } for (int i=2;i

转载于:https://www.cnblogs.com/Juruo-HJQ/p/9306896.html

你可能感兴趣的文章
cf591d
查看>>
MYSQL备份与恢复
查看>>
贪心/数学 Codeforces Round #212 (Div. 2) A. Two Semiknights Meet
查看>>
Python类__call__()方法
查看>>
「小程序JAVA实战」 小程序wxss样式文件的使用(七)
查看>>
容斥定理,皮克公式
查看>>
git+idea
查看>>
cocos2d游戏开发,常用工具集合
查看>>
Kafka深度解析
查看>>
unsigned 后面不跟类型的情况
查看>>
fio硬盘压力测试
查看>>
信号处理——卷积(convolution)的实现
查看>>
多线程同步(循环50 基础加深版)
查看>>
Black and White
查看>>
静态变量和实例变量的区别
查看>>
晨跑【最小费用最大流】
查看>>
景点中心 C组模拟赛
查看>>
iOS国际化(多语言设置)
查看>>
bzoj 2733 平衡树启发式合并
查看>>
sublime简书安装配置
查看>>