BZOJ1433假期的宿舍
2016-03-08 19:50
295 查看
1433: [ZJOI2009]假期的宿舍
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 1894 Solved: 817
Description
![](https://img-blog.csdn.net/20160308194609562)
Input
![](https://img-blog.csdn.net/20160308194638422)
Output
![](https://img-blog.csdn.net/20160308194715720)
Sample Input
1
3
1 1 0
0 1 0
0 1 1
1 0 0
1 0 0
Sample Output
ˆ_ˆ
HINT
对于30% 的数据满足1 ≤ n ≤ 12。
对于100% 的数据满足1 ≤ n ≤ 50,1 ≤ T ≤ 20。
请原谅我没有1A。。
首先多组数据,每次需要memset。。
然后建图的问题。。
读入的矩阵如果是1或者i==j,就把i向j+n连边。。流量为1
在校的向源点连边。。需要床位的向汇点连边。。
记录一下需要的床位。。
然后就A啦啦啦啦啦。。
附上本蒟蒻的代码:
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 1894 Solved: 817
Description
Input
Output
Sample Input
1
3
1 1 0
0 1 0
0 1 1
1 0 0
1 0 0
Sample Output
ˆ_ˆ
HINT
对于30% 的数据满足1 ≤ n ≤ 12。
对于100% 的数据满足1 ≤ n ≤ 50,1 ≤ T ≤ 20。
请原谅我没有1A。。
首先多组数据,每次需要memset。。
然后建图的问题。。
读入的矩阵如果是1或者i==j,就把i向j+n连边。。流量为1
在校的向源点连边。。需要床位的向汇点连边。。
记录一下需要的床位。。
然后就A啦啦啦啦啦。。
附上本蒟蒻的代码:
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int n,h[100001],b[51],a[51],q[100001],dis[100001],head,tail,cnt,ans,sum,f[51][51],num; struct kx { int next,to,v; }; kx edge[100001]; int read() { int w=0,c=1; char ch=getchar(); while (ch<'0' || ch>'9') { if (ch=='-') c=-1; ch=getchar(); } while (ch>='0' && ch<='9') { w=w*10+ch-'0'; ch=getchar(); } return w*c; } void add(int u,int v,int w) { cnt++,edge[cnt].next=h[u],h[u]=cnt,edge[cnt].to=v,edge[cnt].v=w; } bool bfs() { int j,p; memset(dis,-1,sizeof(dis)); q[0]=0,dis[0]=0; head=0,tail=1; while (head<tail) { head++; j=q[head]; p=h[j]; while (p) { if (dis[edge[p].to]<0 && edge[p].v>0) { dis[edge[p].to]=dis[j]+1; tail++; q[tail]=edge[p].to; } p=edge[p].next; } } if (dis[2*n+1]>0) return true; else return false; } int dfs(int x,int f) { int w,used=0,i=h[x]; if (x==2*n+1) return f; while (i) { if (edge[i].v && dis[edge[i].to]==dis[x]+1) { w=f-used; w=dfs(edge[i].to,min(w,edge[i].v)); edge[i].v-=w; edge[i^1].v+=w; used+=w; if (used==f) return f; } i=edge[i].next; } if (!used) dis[x]=-1; return used; } void build() { int i,j; for (i=1;i<=n;i++) for (j=1;j<=n;j++) if (f[i][j] || i==j) add(i,j+n,1),add(j+n,i,0); for (i=1;i<=n;i++) if (a[i]) add(0,i,1),add(i,0,0); for (i=1;i<=n;i++) if (a[i] && !b[i] || !a[i]) add(i+n,2*n+1,1),add(2*n+1,i+n,0),num++; } int main() { int t,i,j; t=read(); while (t--) { memset(h,0,sizeof(h)); cnt=1; num=0; n=read(); for (i=1;i<=n;i++) a[i]=read(); for (i=1;i<=n;i++) b[i]=read(); for (i=1;i<=n;i++) for (j=1;j<=n;j++) f[i][j]=read(); build(); ans=0; while (bfs()) while (sum=dfs(0,0x7fffffff)) ans+=sum; if (ans==num) printf("%s\n","^_^"); else printf("%s\n","T_T"); } return 0; }
相关文章推荐
- 蓝桥杯练习系统历届试题 错误票据
- 【iOS问题】The file “XXX.app” couldn’t be opened because you don’t have permission to view it.
- 如何解决double和float精度问题
- C++中new与malloc的10点区别
- 【LeetCode】217. Contains Duplicate
- online_judge_1389
- 如何在执行raw_input()之前清除输入缓冲区的数据
- 创建一个自己的动态HTML-备
- 深入理解Android(1)——理解Android中的JNI
- 指针函数与函数指针的区别
- C++中的seekg函数
- Delphi的TService的輸入桌面切換(服务程序)(windows登录界面如何截图)(使用了OpenDesktop和GetThreadDesktop等API)
- 【足迹C++primer】46、动态存储类
- windows10的激活及SQL Server 2008 的安装
- 自我介绍 看了构建之法这本书有什么问题?
- 滴滴打车架构
- poj1127
- BeanUtils注册数据转化类型
- Jquery使用ajax以及angularjs 动态模板加载并进行渲染
- 子线程中更新主线程中的UI