【BZOJ】【P1520】【POI2006】【Szk-Schools】【题解】【费用流】

来源:互联网 发布:split 第二个参数 java 编辑:程序博客网 时间:2024/06/07 00:20

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1520

费用流不解释

Code:

#include<bits/stdc++.h>#define in(i) (i<<1)#define out(i) (i<<1|1)using namespace std;const int maxn=410;int n,s,t;struct edge{int u,v,cap,flow,cost;edge(int _u=0,int _v=0,int _cap=0,int _flow=0,int _cost=0):u(_u),v(_v),cap(_cap),flow(_flow),cost(_cost){}};vector<edge>edges;vector<int>G[maxn];int pre[maxn],a[maxn],d[maxn],vis[maxn],cost,flow;void add(int u,int v,int cap,int cost){edges.push_back(edge(u,v,cap,0,cost));G[u].push_back(edges.size()-1);edges.push_back(edge(v,u,0,0,-cost));G[v].push_back(edges.size()-1);}bool spfa(){queue<int>q;q.push(s);memset(d,0x4f,sizeof d);int B=d[0];d[s]=0;a[s]=INT_MAX;while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=0;i<G[u].size();i++){edge e=edges[G[u][i]];if(e.cap>e.flow&&d[e.v]>d[u]+e.cost){d[e.v]=d[u]+e.cost;pre[e.v]=G[u][i];a[e.v]=min(a[u],e.cap-e.flow);if(!vis[e.v]){vis[e.v]=1;q.push(e.v);}}}}if(d[t]==B)return false;cost+=d[t]*a[t];flow+=a[t];for(int u=t;u!=s;u=edges[pre[u]].u){edges[pre[u]].flow+=a[t];edges[pre[u]^1].flow-=a[t];}return true;}int m[maxn],l[maxn],r[maxn],k[maxn];int main(){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d%d%d",&m[i],&l[i],&r[i],&k[i]);s=0,t=n*2+1;for(int i=1;i<=n;i++){add(s,i,1,0);for(int j=l[i];j<=r[i];j++)add(i,j+n,1,k[i]*abs(m[i]-j));add(i+n,t,1,0);}while(spfa());if(flow==n)cout<<cost<<endl;else puts("NIE");return 0;}


0 0
原创粉丝点击