【bzoj1449/2895】 JSOI2009球队收益 费用流
2015-07-20 11:18
691 查看
盗了太神一道题,刚看题觉得是费用流,感觉不是很难,正好好久没有写了,复习一下。结果后来发现自己太天真了,不仅有赢的收益,还有输的收益,这使建边变得很复杂,后来看了题解,真是巧妙呀,先认为后面的比赛双方全输,然后每次流量为1,控制输赢,然后算一算收益,跑一跑最小费用最大流就好了。
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #define inf 1000000000 #define maxn 10010 #define maxm 100010 using namespace std; int to[2*maxm],next[2*maxm],c[2*maxm],p[2*maxm],head[maxn],len[2*maxm]; int dis[maxn],fr[maxn]; bool vis[maxn]; int a[maxn],b[maxn],w[maxn],l[maxn],sum[maxn]; int x[maxn],y[maxn],q[maxn]; int n,m,num,s,t,tot,ans; bool spfa() { memset(vis,0,sizeof(vis)); for (int i=0;i<=t;i++) dis[i]=inf; dis[s]=0; int l=0,r=1; q[1]=s;vis[s]=1; while (l!=r) { l++;if (l==maxn) l=0; int x=q[l]; for (int p=head[x];p;p=next[p]) if (c[p] && dis[to[p]]>dis[x]+len[p]) { dis[to[p]]=dis[x]+len[p]; fr[to[p]]=p; if (!vis[to[p]]) { r++;if (r==maxn) r=0; q[r]=to[p];vis[to[p]]=1; } } vis[x]=0; } if (dis[t]==inf) return 0; else return 1; } void mcf() { int x=inf; for (int i=fr[t];i;i=fr[p[i]]) x=min(c[i],x); for (int i=fr[t];i;i=fr[p[i]]) c[i]-=x,c[i^1]+=x,ans+=x*len[i]; } void costflow() { while (spfa()) mcf(); } void addedge(int x,int y,int z,int f) { //printf("%d %d %d %d\n",x,y,z,f); num++;p[num]=x;to[num]=y;c[num]=z;len[num]=f;next[num]=head[x];head[x]=num; num++;p[num]=y;to[num]=x;c[num]=0;len[num]=-f;next[num]=head[y];head[y]=num; } int main() { scanf("%d%d",&n,&m);num=1; for (int i=1;i<=n;i++) scanf("%d%d%d%d",&w[i],&l[i],&a[i],&b[i]); for (int i=1;i<=m;i++) scanf("%d%d",&x[i],&y[i]); for (int i=1;i<=m;i++) l[x[i]]++,l[y[i]]++; for (int i=1;i<=n;i++) ans+=a[i]*w[i]*w[i]+b[i]*l[i]*l[i]; //printf("%d\n",ans); //for (int i=1;i<=n;i++) printf("%d %d\n",w[i],l[i]); s=0;t=m+n+1; for (int i=1;i<=m;i++) addedge(s,i,1,0); for (int i=1;i<=m;i++) { addedge(i,x[i]+m,1,0); addedge(i,y[i]+m,1,0); addedge(x[i]+m,t,1,a[x[i]]*(2*w[x[i]]+1)-b[x[i]]*(2*l[x[i]]-1));w[x[i]]++;l[x[i]]--; addedge(y[i]+m,t,1,a[y[i]]*(2*w[y[i]]+1)-b[y[i]]*(2*l[y[i]]-1));w[y[i]]++;l[y[i]]--; } costflow(); printf("%d\n",ans); return 0; }
相关文章推荐
- json2.js下载
- javascript自动填充到6位数
- Js popup position which right under target item
- Javascript笔记
- js函数中传递数组
- 在Extjs中动态增加控件
- js触发按钮点击事件
- js排序
- js获取当前时间
- JS iframe父子页面元素调用方法
- javascript js获取url及url参数解析
- 猫东formValidator对SELECT(单选)控件处理的bug
- xml及json解析
- html Javascript MD5
- js将控件隐藏及display属性
- json字符串转为字典
- javascript单例模式的理解
- Jsp生成页面验证码的方法
- JavaScript权威指南_130_第15章_脚本化文档_15.6-创建、 插入、删除节点-删除和替换节点
- JS的基础类型与引用类型