這道題是求二分圖完美匹配。沒看請題意還不知道是求完美匹配,結果爆零。
人一共分三種:
在校學生 && 回家。這類人擁有乙個床,但是不睡。
在校學生 && 不回家。這類人擁有乙個床,但也要睡乙個床。有時不一定睡自己的。
外來學生。這類人沒床卻想睡覺。
顯然要用\(2n\)的空間來建立人和床。
等待匹配的人只有1、3兩種情況,等待匹配的床只有1、2兩種情況。
第1種情況連床沒什麼卵用。又不睡。
只有第2種情況的人可以連自己的床。
第3種情況的人一定要睡別人的床。
在2、3種情況中,只要認識的人有床,就可以連線。
然後套個二分圖匹配的樣子,跑跑網路流就ok了。
最後判斷答案是不是等於人數,輸出那兩個表情即可。
**:
#include#include#include#includeconst int maxn = 1005, inf = 19260817;
struct edges
e[1000005];
int head[maxn], tot;// remember to set tot = 1
int n, s, t;
bool in_school[maxn], go_home[maxn];
int dep[maxn], cur[maxn];
void link(int u, int v, int w)
; head[u] = tot;
}void addedges(int u, int v, int w)
int read()
return ans;
}bool bfs()}}
return dep[t];
}int dfs(int u, int flow)}}
return 0;
}int dinic()
return ans;
}int main()
for(int i = 1; i <= n; i++)
}int ans = dinic();
if(ans == cnt) printf("^_^\n");
else printf("t_t\n");
}return 0;
}
P2055 ZJOI2009 假期的宿舍
題目描述 學校放假了 有些同學回家了,而有些同學則有以前的好朋友來探訪,那麼住宿就是乙個問題。比如 a 和 b 都是學校的學生,a 要回家,而 c 來看b,c 與 a 不認識。我們假設每個人只能睡和自己直接認識的人的床。那麼乙個解決方案就是 b 睡 a 的床而 c 睡 b 的床。而實際情況可能非常複...
P2055 ZJOI2009 假期的宿舍
看到複雜的匹配條件,發現要讓乙個人和乙個床匹配,所以就每個有床的人 指本校學生 和t連一條邊,每個需要床的人 指外校的人和不回家的人 和s連一條邊,i和j互相認識就把i和j的床連在一起,自己和自己的床肯定連一條邊,然後流量每多1,就表示滿足了乙個人對床的需求,跑最大流就相當於最多能滿足多少人的需求,...
P2055 ZJOI2009 假期的宿舍
學校放假了 有些同學回家了,而有些同學則有以前的好朋友來探訪,那麼住宿就是乙個問題。比如 a 和 b 都是學校的學生,a 要回家,而 c 來看b,c 與 a 不認識。我們假設每個人只能睡和自己直接認識的人的床。那麼乙個解決方案就是 b 睡 a 的床而 c 睡 b 的床。而實際情況可能非常複雜,有的人...