1 条题解
-
0
自动搬运
来自洛谷,原作者为

bztMinamoto
**搬运于
2025-08-24 21:39:33,当前版本为作者最后更新于2018-08-21 14:32:13,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
话说其实不用新建图的……我看到楼下几位大佬的做法都是0.5倍经验+码量巨大的……
实际上只要直接跑一个费用流就行了。对于第一问,我们直接连边,然后令费用为,跑一遍,输出最大流即可
对于第二问,只要在原来的每条边上再连一条边,容费为扩边费用,然后的限制只要再建一个源点往连容费的边。在残量网络上再跑一遍,输出最小费用即可
考虑为什么这样做是对的。因为要跑最小费用最大流,而原图是无花费的最大流,那么只要在此残量网络上继续增广,就可以保证跑出最小费用了
//minamoto #include<iostream> #include<cstdio> #include<cstring> #include<queue> #define inf 0x3f3f3f3f using namespace std; #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) char buf[1<<21],*p1=buf,*p2=buf; inline int read(){ #define num ch-'0' char ch;bool flag=0;int res; while(!isdigit(ch=getc())) (ch=='-')&&(flag=true); for(res=num;isdigit(ch=getc());res=res*10+num); (flag)&&(res=-res); #undef num return res; } const int N=1005,M=50005; struct node{ int u,v,f,e; node(){} node(int u,int v,int f,int e):u(u),v(v),f(f),e(e){} }E[M]; int ver[M],Next[M],head[N],edge[M],flow[M],tot=1; int dis[N],disf[N],vis[N],Pre[N],last[N]; int n,m,k,s,t,maxflow,mincost; queue<int> q; inline void add(int u,int v,int f,int e){ ver[++tot]=v,Next[tot]=head[u],head[u]=tot,flow[tot]=f,edge[tot]=e; ver[++tot]=u,Next[tot]=head[v],head[v]=tot,flow[tot]=0,edge[tot]=-e; } bool spfa(){ memset(dis,0x3f,sizeof(dis)); q.push(s),dis[s]=0,disf[s]=inf,Pre[t]=-1; while(!q.empty()){ int u=q.front();q.pop();vis[u]=0; for(int i=head[u];i;i=Next[i]){ int v=ver[i]; if(flow[i]&&dis[v]>dis[u]+edge[i]){ dis[v]=dis[u]+edge[i],Pre[v]=u,last[v]=i; disf[v]=min(disf[u],flow[i]); if(!vis[v]) vis[v]=1,q.push(v); } } } return ~Pre[t]; } void dinic(){ while(spfa()){ int u=t;maxflow+=disf[t],mincost+=disf[t]*dis[t]; while(u!=s){ flow[last[u]]-=disf[t]; flow[last[u]^1]+=disf[t]; u=Pre[u]; } } } int main(){ n=read(),m=read(),k=read(); s=1,t=n; for(int i=1;i<=m;++i){ int u=read(),v=read(),f=read(),e=read(); E[i]=node(u,v,f,e); add(u,v,f,0); } dinic(); printf("%d ",maxflow); for(int i=1;i<=m;++i){ int u=E[i].u,v=E[i].v,e=E[i].e; add(u,v,inf,e); } s=0; add(s,1,k,0); dinic(); printf("%d\n",mincost); return 0; }
- 1
信息
- ID
- 1640
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者