最大流
2016-07-25 18:27
169 查看
hdu5073
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define clr(x,y) memset(x,y,sizeof(x)) using namespace std; const int inf=0x3f3f3f3f; const int _=600; int n, m,ans; int les[_],mor[_],lid[_],mid[_],f[_],g[_]; int pop(int x) { int ret=0; while(x)x-=x&-x,ret++; return ret; } namespace G { struct Edge{ int v,c,n; Edge(int v=0,int c=0,int n=0):v(v),c(c),n(n){} }e[_*_*10]; int hed[_],ent; void Init(){ent=0;clr(hed,-1);} void addEdge(int u,int v,int c) { e[ent]=Edge(v,c,hed[u]);hed[u]=ent++; e[ent]=Edge(u,0,hed[v]);hed[v]=ent++; } int st,ed; int dis[_]; queue<int>Q; int bfs() { clr(dis,-1); dis[st]=0; while(!Q.empty())Q.pop(); Q.push(st); while(!Q.empty()) { int u=Q.front();Q.pop(); for(int i=hed[u];i!=-1;i=e[i].n) { int v=e[i].v; if(dis[v]==-1&&e[i].c>0) { dis[v]=dis[u]+1; if(v==ed)return 1; Q.push(v); } } } return 0; } int dfs(int u,int now) { if(u==ed)return now; int ret=0; for(int i=hed[u];i!=-1;i=e[i].n) { int v=e[i].v; if(dis[v]==dis[u]+1&&e[i].c>0) { int tmp=dfs(v,min(now,e[i].c)); now-=tmp; e[i].c-=tmp; e[i^1].c+=tmp; ret+=tmp; if(now==0)break; } } if(now==0)dis[u]=-1; return ret; } void go() { n=1<<n; m=1<<m; Init(); ans=0; clr(les,-1); clr(mor,-1); st=0;ed=n*2+1; for(int i=1;i<=n;i++)scanf("%d",&f[i]); for(int i=1;i<=n;i++)scanf("%d",&g[i]); for(int i=1;i<=n;i++) { for(int j=0;j<m;j++) { int x;scanf("%d",&x); x+=1024; if(j<f[i]) { if(x>les[i]) les[i]=x,lid[i]=j; } else { if(x>mor[i]) mor[i]=x,mid[i]=j; } } } for(int i=1;i<=n;i++) { int flag=pop(i-1); addEdge(st,i,flag&1?les[i]:mor[i]); addEdge(i+n,ed,flag&1?mor[i]:les[i]); addEdge(i,i+n,inf); for(int j=i+1;j<=n;j++)if(pop((i-1)^(j-1))==1) { flag&1 ?addEdge(i,j+n,g[i]^g[j]) :addEdge(j,i+n,g[i]^g[j]); } } while(bfs())ans+=dfs(st,inf); for(int i=1;i<=n;i++) { if(i>1)printf(" "); int flag=pop(i-1); if(flag&1) { dis[i]!=-1 ?printf("%d",lid[i]) :printf("%d",mid[i]); } else { dis[i]!=-1 ?printf("%d",mid[i]) :printf("%d",lid[i]); } } puts(""); } } int main() { int cas; scanf("%d",&cas); while(~scanf("%d%d",&n,&m)) { G::go(); } }
相关文章推荐
- 3.依赖倒置原则(Dependence Inversion Principle)
- java中对象变量及new对像赋值的1个语法现像
- Android开发之shape自定义图形
- shell--4.echo和printf
- fixed stackalloc
- Java 代码性能优化总结
- 自动化测试用例编写守则
- SharedPreferences判断是否第一次进入程序
- Hbase java创建表时,调试一直卡住
- Gson选择性排除序列化字段
- Linux命令速查手册
- 2015CCPC南阳场 H - Sudoku
- A*B Problem II
- Redis的调用
- 解决异步获取user session的方法
- Java多线程之BlockingQueue深入分析
- 单例
- leetcode-python 第五周
- 浏览器打开应用指定的界面
- 统计学习方法十:隐马尔科夫模型二