HDU - 6437:Videos (裸的費用流)
阿新 • • 發佈:2018-11-01
。。。懶得說什麼了
#include<bits/stdc++.h> using namespace std; const int maxn=100000; const int inf=1<<30;int To[maxn],Laxt[maxn],Next[maxn],cap[maxn],cost[maxn]; int S,T,cnt,dis[maxn],ans; bool inq[maxn],vis[maxn]; deque<int>q; void add(int u,int v,int c,int cc) { Next[++cnt]=Laxt[u];Laxt[u]=cnt; To[cnt]=v;cap[cnt]=c;cost[cnt]=-cc; Next[++cnt]=Laxt[v];Laxt[v]=cnt; To[cnt]=u;cap[cnt]=0;cost[cnt]=cc; } bool spfa() { for(int i=0;i<=T;i++) inq[i]=0; for(int i=0;i<=T;i++) dis[i]=inf; inq[T]=1; dis[T]=0; q.push_back(T); while(!q.empty()) { int u=q.front(); q.pop_front(); inq[u]=0; for(int i=Laxt[u];i;i=Next[i]) { int v=To[i]; if(cap[i^1]&&dis[v]>dis[u]-cost[i]) { dis[v]=dis[u]-cost[i]; if(!inq[u]){ inq[v]=1; if(q.empty()||dis[v]>dis[q.front()]) q.push_back(v);else q.push_front(v); } } } } return dis[S]<inf; } int dfs(int u,int flow) { vis[u]=1; if(u==T||flow==0) return flow; int tmp,delta=0; for(int i=Laxt[u];i;i=Next[i]) { int v=To[i]; if((!vis[v])&&cap[i]&&dis[v]==dis[u]-cost[i]) { tmp=dfs(v,min(cap[i],flow-delta)); delta+=tmp; cap[i]-=tmp; cap[i^1]+=tmp; } } return delta; } int s[maxn],t[maxn],w[maxn],c[maxn]; int main() { int N,M,K,W,C,i,j; scanf("%d",&C); while(C--){ scanf("%d%d%d%d",&N,&M,&K,&W); cnt=1; ans=0; T=M+M+2; for(int i=0;i<=T;i++) vis[i]=Laxt[i]=0; for(int i=1;i<=M;i++) scanf("%d%d%d%d",&s[i],&t[i],&w[i],&c[i]); for(int i=1;i<=M;i++) for(int j=1;j<=M;j++) if(i!=j&&t[i]<=s[j]) add(i+M,j,1,c[i]==c[j]?-W:0); add(S,T-1,K,0); //限制N人 for(int i=1;i<=M;i++) add(T-1,i,1,0); //收益 for(int i=1;i<=M;i++) add(i,i+M,1,w[i]); for(int i=1;i<=M;i++) add(i+M,T,1,0); while(spfa()){ vis[T]=1; while(vis[T]){ for(i=0;i<=T;i++) vis[i]=0; ans-=dis[S]*dfs(S,N); } } printf("%d\n",ans); } return 0; }