學校放假了 · · · · · · 有些同學回家了,而有些同學則有以前的好朋友來探訪,那麼住宿就是乙個問題。比如 a 和 b 都是學校的學生,a 要回家,而 c 來看b,c 與 a 不認識。我們假設每個人只能睡和自己直接認識的人的床。那麼乙個解決方案就是 b 睡 a 的床而 c 睡 b 的床。而實際情況可能非常複雜,有的人可能認識好多在校學生,在校學生之間也不一定都互相認識。我們已知一共有 n 個人,並且知道其中每個人是不是本校學生,也知道每個本校學生是否回家。問是否存在乙個方案使得所有不回家的本校學生和來看他們的其他人都有地方住。
輸入格式:
第一行乙個數 t 表示資料組數。接下來 t 組資料,每組資料第一行乙個數n 表示涉及到的總人數。接下來一行 n 個數,第 i 個數表示第 i 個人是否是在校學生 (0 表示不是,1 表示是)。再接下來一行 n 個數,第 i 個數表示第 i 個人是否回家 (0 表示不會家,1 表示回家,注意如果第 i 個人不是在校學生,那麼這個位置上的數是乙個隨機的數,你應該在讀入以後忽略它)。接下來 n 行每行 n 個數,第 i 行第 j 個數表示 i 和 j 是否認識 (1 表示認識,0 表示不認識,第 i 行 i 個的值為 0,但是顯然自己還是可以睡自己的床),認識的關係是相互的。
輸出格式:
對於每組資料,如果存在乙個方案則輸出 「 ˆ_ˆ 」(不含引號) 否則輸出「t_t」(不含引號)。(注意輸出的都是半形字元,即三個符號的 ascii 碼分別為94,84,95)
輸入樣例#1:
131 1 0
0 1 0
0 1 1
1 0 0
1 0 0
輸出樣例#1:
ˆ_ˆ
對於 30% 的資料滿足 1 ≤ n ≤ 12。
對於 100% 的資料滿足 1 ≤ n ≤ 50,1 ≤ t ≤ 20。
多組資料!!!
.........................
........................
居然寫了我三遍..
這題不明顯的是二分法圖匹配的問題, 就是要你確定在校不回家的學生與不在校的學生能不能每個都有床睡,如果有輸出^_^ 如果沒有,輸出t-t。
對於二分圖來說,重要的是確定兩集合點的關係,這題的關係是人對床, 於是,我們將在校不回家的學生與他自己的床相連,並且,如果a認識b且b是在校學生,則將a與b的床相連。
圖建好後就直接用匈牙利演算法求最大匹配,在這值得注意的是,我們在求匹配時要濾過在校回家的學生。如果最大匹配值等於需要床的學生人數,則說明每個需要的床的人都能睡覺。
#include#include#define n 60
intread()
returnx;}
int cc; //
需要床的人數
intn;
intmatch[n][n],result[n];
bool
use[n];
bool dfs(int
now)
}return
false;}
intxue[n],jia[n];
bool
xiongyali()
}if(ans == cc)return
true
;
else
return
false;}
intmain()
for(int i = 1; i <= n; i++)
if((xue[i] && !jia[i])|| !xue[i])cc++; //
在學校不回家的人數加上不在學校的人數
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(xiongyali())printf("
^_^\n");
else printf("
t_t\n");
}return0;
}
ZJOI2009 假期的宿舍
題目描述 學校放假了 有些同學回家了,而有些同學則有以前的好朋友來探訪,那麼住宿就是乙個問題。比如 a 和 b 都是學校的學生,a 要回家,而 c 來看b,c 與 a 不認識。我們假設每個人只能睡和自己直接認識的人的床。那麼乙個解決方案就是 b 睡 a 的床而 c 睡 b 的床。而實際情況可能非常複...
ZJOI2009 假期的宿舍
這道題分析下就會發現是乙個二分圖匹配。將在校 包括來校訪友 和床單構成圖,判斷最大匹配數是否為總在校人數即可。這裡用的是 km 演算法。1 include 2 3using namespace std 45 define re register 6 define rep i,a,b for re i...
ZJOI2009 假期的宿舍
題目 洛谷p2055 bzoj1433 codevs2347。題目大意 有n個人,有些人是學生,有些人是來看學生的 不是學生 學生有床,而非學生沒有 廢話!有些學生回家,有些學生晚上住校,來看學生的人要住在學校裡。現在有一些認識的關係,規定每個要在學校睡覺的人只會睡在自己認識的人的床上,問能否使所有...