P2055 ZJOI2009 假期的宿舍

2022-05-16 01:08:51 字數 1982 閱讀 5016

學校放假了 · · · · · · 有些同學回家了,而有些同學則有以前的好朋友來探訪,那麼住宿就是乙個問題。

比如 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)

這題可以算比較經典的拆點了,作為乙個萌新,我想了很久的建圖,後來想到,可以把人和床作為二分圖的兩個點集拆開建圖a點集代表人(i),b點集代表床(i+n),用goal記下需要回家的人數

1.如果不是我校學生,那麼將其人就連向s。把goal++

2.如果是我校學生就將他的人連向床,並把他的床連向t,同時如果他不回家就將人連向s,並且goal++。

3.如果兩人認識就將該人連向對方的床

這樣乙個二分圖模版就建好了,像這樣(樣例)

用網路流跑一跑判斷flow是否等於goal就可以了

用的是ford-fulkerson(增廣路)其實這東西有時候比dinic還快一點

#include#define inf 1<<30

using namespace std;

const int maxn=500+5,maxm=250000+5;

int head[maxn],vis[maxn],sch[maxn];

int s,t,flow=0;

int goal=0;

struct edge

e[maxm];

int size=1;

void addedge(int u,int v,int val)

void init()

inline int read()

while(ch<='9'&&ch>='0')

return x*f;

}int dfs(int u,int f)

} }return 0;

}int maxflow()

}int main()

for(int i=1;i<=n;i++)

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++)

if(read()==1&&sch[j])addedge(i,j+n,inf);

maxflow()==1?printf("^_^\n"):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 假期的宿舍

這道題是求二分圖完美匹配。沒看請題意還不知道是求完美匹配,結果爆零。人一共分三種 在校學生 回家。這類人擁有乙個床,但是不睡。在校學生 不回家。這類人擁有乙個床,但也要睡乙個床。有時不一定睡自己的。外來學生。這類人沒床卻想睡覺。顯然要用 2n 的空間來建立人和床。等待匹配的人只有1 3兩種情況,等待...