大佬看一下,蜜汁73分

P3381 【模板】最小费用最大流

@[rainheavy](/space/show?uid=107646) ``` // luogu-judger-enable-o2 #include<iostream> #include<cstdio> #include<vector> #include<queue> using namespace std; struct data{ long long a,b,c,cost; data(long long a=0,long long b=0,long long c=0,long long cost=0){ this->a=a; this->b=b; this->c=c; this->cost=cost; } }; vector<data> v; vector<long long> u[5001]; long long n,m,f[5001],x,y,z,w,s,t,ans1,ans2,fa[5001][2],co[5001]; bool r[5001]; void add(long long a,long long b,long long c,long long d){ v.push_back(data(a,b,c,d)); u[a].push_back(v.size()-1); v.push_back(data(b,a,0,-d)); u[b].push_back(v.size()-1); } void spfa(){ queue<long long> q; q.push(s); while(!q.empty()){ x=q.front(); q.pop(); r[x]=false; for(long long i=0;i<u[x].size();i++){ y=u[x][i]; data da=v[y]; if(co[da.b]>co[x]+da.cost&&da.c){ f[da.b]=min(da.c,f[x]); co[da.b]=co[x]+da.cost; fa[da.b][0]=x; fa[da.b][1]=y; if(!r[da.b]){ r[da.b]=true; q.push(da.b); } } } } } void dfs(){ while(1){ for(long long i=1;i<=n;i++){ f[i]=0; r[i]=false; co[i]=1000000000000000; } f[s]=1000000000000000; co[s]=0; spfa(); if(f[t]==0)break; for(long long i=t;i!=s;i=fa[i][0]){ v[fa[i][1]].c-=f[t]; v[fa[i][1]^1].c+=f[t]; } ans1=ans1+f[t]; ans2=ans2+f[t]*co[t]; } } int main(){ scanf("%lld%lld%lld%lld",&n,&m,&s,&t); for(long long i=1;i<=m;i++){ scanf("%lld%lld%lld%lld",&x,&y,&z,&w); add(x,y,z,w); } dfs(); printf("%lld %lld",ans1,ans2); } ```
by suyiheng @ 2019-01-05 22:11:10


您的代码我实在看不懂
by suyiheng @ 2019-01-05 22:11:27


|