topcoder FoxAndCity
来源:互联网 发布:知与行杂志版面费 编辑:程序博客网 时间:2024/06/06 01:24
可以看成给每个点随便选权值,有相邻边的点权值相差不超过
#include<algorithm>#include<vector>#include<string>using namespace std;const int maxn=200010,s=20005,t=20006,oo=0x3f3f3f3f;class FoxAndCity{ int fir[maxn],ne[maxn],to[maxn],w[maxn], que[maxn],dep[maxn],cur[maxn],id[45][45], n,num,tot;private: void add(int u,int v,int x) { num++; ne[num<<1]=fir[u]; fir[u]=num<<1; to[num<<1]=v; w[num<<1]=x; ne[num<<1|1]=fir[v]; fir[v]=num<<1|1; to[num<<1|1]=u; w[num<<1|1]=0; } int bfs() { int hd=1,tl=1,u,v; for (int i=1;i<=tot;i++) dep[i]=0; dep[t]=0; que[dep[s]=1]=s; while (hd<=tl) { u=que[hd++]; cur[u]=fir[u]; for (int i=fir[u];i;i=ne[i]) if (w[i]&&!dep[v=to[i]]) { dep[v]=dep[u]+1; que[++tl]=v; } } return dep[t]; } int dfs(int u,int lim) { if (u==t) return lim; int ret=0,v,x; for (int &i=cur[u];i&&ret<lim;i=ne[i]) if (w[i]&&dep[v=to[i]]==dep[u]+1) { x=dfs(v,min(w[i],lim-ret)); ret+=x; w[i]-=x; w[i^1]+=x; } return ret; }public: int minimalCost(vector<string> linked,vector<int> want) { int ans=0; n=want.size(); tot=num=0; for (int i=0;i<n;i++) for (int j=0;j<=n;j++) id[i][j]=++tot; for (int i=1;i<=tot;i++) fir[i]=0; fir[s]=fir[t]=0; add(s,id[0][0],oo); add(id[0][n],t,oo); for (int i=1;i<n;i++) add(id[0][i],id[0][i+1],oo); for (int i=1;i<n;i++) { add(s,id[i][0],oo); add(id[i][0],id[i][1],oo); add(id[i][n],t,oo); for (int j=want[i]-1;j>=1;j--) add(id[i][j],id[i][j+1],(want[i]-j)*(want[i]-j)); for (int j=want[i]+1;j<n;j++) add(id[i][j],id[i][j+1],(j-want[i])*(j-want[i])); } for (int i=0;i<n;i++) for (int j=i+1;j<n;j++) if (linked[i][j]=='Y') for (int k=0;k<n;k++) { add(id[i][k+1],id[j][k],oo); add(id[j][k+1],id[i][k],oo); } while (bfs()) ans+=dfs(s,oo); return ans; }};
0 0
- topcoder FoxAndCity
- [距离限制模型 & 最小割]TopCoder SRM590 DIV1 1000. FoxAndCity
- TopCoder
- topcoder
- Topcoder
- topcoder
- topcoder
- Topcoder
- [最小割] SRM 590 div1 FoxAndCity
- [最小割]SRM 590 div 1 1000pts FoxAndCity
- TOPCODER交流
- topcoder 小结
- TopCoder介绍
- topcoder是什么?
- TopCoder教程
- TopCoder简介
- TopCoder入门教程
- topcoder入门
- ros::spin() 和 ros::spinOnce() 区别及详解
- oracle如何设置序列当前值
- hdu 3810 超大容量背包(n=50不是40)
- jsp ajax实例讲解
- H5 游戏开发技术要点
- topcoder FoxAndCity
- 深圳社保明细查询
- Linux文件系统简介
- Ubuntu16.04 docker安装
- React Native笔记
- ajax表单和form表单提交的区别
- 哲学家就餐问题(java实现)
- 通过Revit API创建一个族并载入到工程文档中
- Java程序员的日常——经验贴(纯干货)