【BZOJ】【1449】【JSOI2009】球队收益
2015-03-20 11:30
489 查看
网络流/费用流/二分图最小权匹配
题解:http://blog.csdn.net/huzecong/article/details/9119741太神了!由于一赢一输不好建图,就先假设全部都输,再将赢的收益修改!就变成普通的二分图了!!
费用与流量的平方相关时拆边……这个稍微处理一下即可
/************************************************************** Problem: 1449 User: Tunix Language: C++ Result: Accepted Time:676 ms Memory:3940 kb ****************************************************************/ //BZOJ 1449 #include<cmath> #include<vector> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define rep(i,n) for(int i=0;i<n;++i) #define F(i,j,n) for(int i=j;i<=n;++i) #define D(i,j,n) for(int i=j;i>=n;--i) #define pb push_back #define CC(a,b) memset(a,b,sizeof(a)) using namespace std; int getint(){ int v=0,sign=1; char ch=getchar(); while(!isdigit(ch)) {if(ch=='-') sign=-1; ch=getchar();} while(isdigit(ch)) {v=v*10+ch-'0'; ch=getchar();} return v*sign; } const int N=10000,M=100000,INF=~0u>>2; typedef long long LL; const double eps=1e-8; /*******************template********************/ int n,m,w ,l ,c ,d ,du ; LL ans; struct edge{int from,to,v,c;}; struct Net{ edge E[M]; int head ,next[M],cnt; void ins(int x,int y,int z,int c){ E[++cnt]=(edge){x,y,z,c}; next[cnt]=head[x]; head[x]=cnt; } void add(int x,int y,int z,int c){ ins(x,y,z,c); ins(y,x,0,-c); } int S,T,d ,from ,Q[M]; bool inq ; bool spfa(){ int l=0,r=-1; F(i,0,T)d[i]=INF; d[S]=0; Q[++r]=S; inq[S]=1; while(l<=r){ int x=Q[l++]; inq[x]=0; for(int i=head[x];i;i=next[i]) if(E[i].v && d[x]+E[i].c<d[E[i].to]){ d[E[i].to]=d[x]+E[i].c; from[E[i].to]=i; if(!inq[E[i].to]){ Q[++r]=E[i].to; inq[E[i].to]=1; } } } return d[T]!=INF; } void mcf(){ int x=INF; for(int i=from[T];i;i=from[E[i].from]) x=min(x,E[i].v); for(int i=from[T];i;i=from[E[i].from]){ E[i].v-=x; E[i^1].v+=x; } ans+=x*d[T]; } void init(){ n=getint(); m=getint(); cnt=1; ans=0; S=0; T=n+m+1; F(i,1,n){ w[i]=getint();l[i]=getint(); c[i]=getint();d[i]=getint(); // ans+=w[i]*w[i]*c[i]+l[i]*l[i]*d[i]; } int x,y; F(i,1,m){ x=getint(); y=getint(); du[x]++; du[y]++; add(x,i+n,1,0); add(y,i+n,1,0); add(i+n,T,1,0); l[x]++; l[y]++; } F(i,1,n) ans+=w[i]*w[i]*c[i]+l[i]*l[i]*d[i]; F(i,1,n) F(j,1,du[i]) add(S,i,1,((j+w[i])*2-1)*c[i] - ((l[i]-j+1)*2-1)*d[i] ); while(spfa()) mcf(); printf("%lld\n",ans); } }G1; int main(){ #ifndef ONLINE_JUDGE freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); #endif G1.init(); return 0; }
View Code
1449: [JSOI2009]球队收益
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 516 Solved: 283
[Submit][Status][Discuss]
Description
Input
Output
一个整数表示联盟里所有球队收益之和的最小值。Sample Input
3 31 0 2 1
1 1 10 1
0 1 3 3
1 2
2 3
3 1
Sample Output
43HINT
Source
[Submit][Status][Discuss]相关文章推荐
- BZOJ 1449 JSOI2009 球队收益 费用流
- 【bzoj1449/2895】 JSOI2009球队收益 费用流
- 【JSOI2009】bzoj1449 球队收益
- bzoj1449/2895[JSOI2009]球队收益
- 【BZOJ 1449】 1449: [JSOI2009]球队收益 (最小费用流)
- BZOJ 1449: [JSOI2009]球队收益 此坑必填 先去打cf
- [拆边费用流] BZOJ 1449 [JSOI2009]球队收益
- bzoj1449: [JSOI2009]球队收益&&bzoj2597: [Wc2007]剪刀石头布
- bzoj1449: [JSOI2009]球队收益
- BZOJ 1449: [JSOI2009]球队收益 拆边费用流
- 【bzoj1449】【JSOI2009】【球队收益】【费用流】
- BZOJ 1449/2895: [JSOI2009]球队收益|网络流
- BZOJ1449: [JSOI2009]球队收益
- bzoj1449【JSOI2009】球队收益
- bzoj 1449 [JSOI2009]球队收益(费用拆分,最小费用流)
- 【BZOJ1449/2895】[JSOI2009]球队收益/球队预算 最小费用最大流
- [网络流] bzoj1449: [JSOI2009]球队收益
- bzoj1449 [JSOI2009]球队收益
- BZOJ 1449 JSOI2009 球队收益 费用流
- Bzoj1449 [JSOI2009]球队收益