bzoj1433 [ZJOI2009]假期的宿舍 最大流

[ZJOI2009]假期的宿舍

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 3429  Solved: 1459
[Submit][Status][Discuss]

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。

源点向所有有床位的连边

需要床位的向汇点连边

如果i可以睡j的床

i向j‘连边

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #define T 101
 5 #define inf 0x7fffffff
 6 using namespace std;
 7 int sc[51];
 8 int n,tot,cnt=1,ans,head[105],h[105];
 9 struct data{int to,next,v;}e[50001];
10 void ins(int u,int v,int w)
11 {cnt++;e[cnt].to=v;e[cnt].v=w;e[cnt].next=head[u];head[u]=cnt;}
12 void insert(int u,int v,int w)
13 {ins(u,v,w);ins(v,u,0);}
14 bool bfs()
15 {
16      int q[105],t=0,w=1,i,now;
17      memset(h,-1,sizeof(h));
18      q[0]=h[0]=0;
19      while(t!=w)
20      {
21             now=q[t];t++;if(t==101)t=0;
22             i=head[now];
23             while(i)
24             {
25                   if(e[i].v&&h[e[i].to]<0)
26                         {h[e[i].to]=h[now]+1;q[w++]=e[i].to;if(w==101)w=0;}
27                   i=e[i].next;
28              }
29      }
30      if(h[T]==-1)return 0;
31      return 1;
32      }
33 int dfs(int x,int f)
34 {
35     if(x==T)return f;
36     int i=head[x],w,used=0;
37     while(i)
38     {
39             if(e[i].v&&h[e[i].to]==h[x]+1)
40             {
41                 w=f-used;
42                 w=dfs(e[i].to,min(w,e[i].v));
43                 e[i].v-=w;
44                 e[i^1].v+=w;
45                 used+=w;
46                 if(used==f)return f;
47                 }
48                 i=e[i].next;
49             }
50     if(!used)h[x]=-1;
51     return used;
52     }
53 void dinic(){while(bfs())ans+=dfs(0,inf);}
54 int main()
55 {
56     int test;scanf("%d",&test);
57     while(test--)
58     {
59         tot=ans=0;cnt=1;
60         memset(head,0,sizeof(head));
61         scanf("%d",&n);
62         for(int i=1;i<=n;i++)
63         {
64             scanf("%d",&sc[i]);
65             if(sc[i])
66                 insert(i+n,T,1);//如果是在校学生,则有床位
67         }
68         int x;
69         for(int i=1;i<=n;i++)
70         {
71             scanf("%d",&x);
72             if((sc[i]&&!x)||!sc[i])
73             {
74                 insert(0,i,1);//不回家或者外校的需要床
75                 tot++;
76             }
77         }
78         for(int i=1;i<=n;i++)
79            for(int j=1;j<=n;j++)
80            {
81                   scanf("%d",&x);
82                   if(x||i==j)insert(i,j+n,1);//可以睡的床
83            }
84         dinic();
85         if(ans==tot)puts("^_^");
86         else puts("T_T");
87     }
88     return 0;
89 }

原文地址:https://www.cnblogs.com/fengzhiyuan/p/8286774.html

时间: 2024-10-12 13:08:01

bzoj1433 [ZJOI2009]假期的宿舍 最大流的相关文章

bzoj1433 [ZJOI2009]假期的宿舍(最大流)

1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1717  Solved: 754[Submit][Status][Discuss] 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 ≤

bzoj 1433: [ZJOI2009]假期的宿舍 -- 最大流

1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec  Memory Limit: 162 MB 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. 我们从源点向所有住宿的人连边,从所有的床位连向汇点,然后再从人连向他所

bzoj1433: [ZJOI2009]假期的宿舍

1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2286  Solved: 969[Submit][Status][Discuss] Description Input Output Sample Input 131 1 00 1 00 1 11 0 01 0 0 Sample Output ˆ ˆ HINT 对于30% 的数据满足1 ≤ n ≤ 12.对于100% 的数据满足1 ≤ n ≤ 50,1 ≤

bzoj1433[ZJOI2009]假期的宿舍(匈牙利)

1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2544  Solved: 1074 [Submit][Status][Discuss] 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

BZOJ1433 [ZJOI2009]假期的宿舍 二分图匹配 匈牙利算法

原文链接http://www.cnblogs.com/zhouzhendong/p/8372785.html 题目传送门 - BZOJ1433 题解 我们理一理题目. 在校的学生,有自己的床,还可以睡朋友的床. 离校的学生,不占床. 外来的学生,只能睡朋友的床. 然后就是一个裸的二分图匹配了. 代码 #include <cstring> #include <cstdlib> #include <cmath> #include <cstdio> #includ

[BZOJ1433][ZJOI2009]假期的宿舍 二分图匹配

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1433 首先留在学校的学生向自己的床连边. 要住在学校里的人向认识的学生的床连边. 跑二分图匹配,看匹配的数量是否等于住在学校的人数. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int inline readint(){ 6 int N

[BZOJ1433][luogu_P2055][ZJOI2009]假期的宿舍

[BZOJ1433][luogu_P2055][ZJOI2009]假期的宿舍 试题描述 输入 输出 输入示例 1 3 1 1 0 0 1 0 0 1 1 1 0 0 1 0 0 输出示例 ^_^ 数据规模及约定 对于 \(30\texttt{%}\) 的数据满足 \(1 \le n \le 12\). 对于 \(100\texttt{%}\) 的数据满足 \(1 \le n \le 50,1 \le T \le 20\). 题解 每个人和每个人的床分别建一个节点,源点向不回家的和不是学生的人连边

bzoj1433:[ZJOI2009]假期的宿舍

明显的二分图最大匹配. #include<cstdio> #include<cstring> #include<cctype> #include<algorithm> #include<bitset> using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) #define clr(x,c

luogu P2055 [ZJOI2009]假期的宿舍

二次联通门 : luogu P2055 [ZJOI2009]假期的宿舍 /* luogu P2055 [ZJOI2009]假期的宿舍 建图时分为两个集合 床一个集合 人一个集合 S到床连边 人与自己认识的人连边 人与T点连边 然后跑最大流判断即可 */ #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <queue> #de