BZOJ 1520 POI2006 Szk-Schools
1520: [POI2006]Szk-Schools
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 771 Solved: 398
[Submit][Status][Discuss]
Description
Input
Output
如果有可行解, 输出最小代价,否则输出NIE.
Sample Input
5
1 1 2 3
1 1 5 1
3 2 5 5
4 1 5 10
3 3 3 1
1 1 2 3
1 1 5 1
3 2 5 5
4 1 5 10
3 3 3 1
Sample Output
9
HINT
Source
很裸的费用流
#include <bits/stdc++.h> #define ll long long #define inf 1e9+10 using namespace std; inline int read(){ int x=0;int f=1;char ch=getchar(); while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} return x*f; } const int MAXN=1e5+10; struct node{ int y,next,back,flow,w; }e[MAXN]; int linkk[MAXN],len=0,vis[405],dis[405],s,t,n,ans=0; inline void insert(int x,int y,int f,int c){ e[++len].y=y;e[len].next=linkk[x];linkk[x]=len;e[len].back=len+1;e[len].flow=f;e[len].w=c; e[++len].y=x;e[len].next=linkk[y];linkk[y]=len;e[len].back=len-1;e[len].flow=0;e[len].w=-c; } inline bool getdis(){ memset(dis,10,sizeof(dis)); memset(vis,0,sizeof(vis)); dis[t]=0;vis[t]=1; deque<int>q;q.push_front(t); while(!q.empty()){ int tn=q.front();q.pop_front(); for(int i=linkk[tn];i;i=e[i].next){ if(e[e[i].back].flow&&dis[e[i].y]>dis[tn]-e[i].w){ dis[e[i].y]=dis[tn]-e[i].w; if(!vis[e[i].y]){ if(!q.empty()&&dis[q.front()]>dis[e[i].y]) q.push_front(e[i].y); else q.push_back(e[i].y);vis[e[i].y]=1; } } } vis[tn]=0; } return dis[s]<168430090; } inline int getcost(int x,int flow){ int f=0,d;vis[x]=1; if(x==t) return flow; for(int i=linkk[x];i;i=e[i].next){ if(!vis[e[i].y]&&e[i].flow&&dis[e[i].y]==dis[x]-e[i].w){ if(d=getcost(e[i].y,min(e[i].flow,flow-f))){ f+=d;e[i].flow-=d;e[e[i].back].flow+=d; ans+=e[i].w*d;if(f==flow) return flow; } } } return f; } inline int zkw(){ int sum=0; while(getdis()){ vis[t]=1; while(vis[t]){ memset(vis,0,sizeof(vis)); sum+=getcost(s,inf); } } return sum; } int main(){ n=read();s=0;t=2*n+1; for(int i=1;i<=n;i++){ int m=read();int x=read();int y=read();int k=read(); for(int j=x;j<=y;j++){ insert(i,j+n,1,abs(m-j)*k); } insert(s,i,1,0); insert(i+n,t,1,0); } int sum=zkw(); if(sum==n) cout<<ans<<endl; else cout<<"NIE"<<endl; return 0; }