看到複雜的匹配條件,發現要讓乙個人和乙個床匹配,所以就每個有床的人(指本校學生)和t連一條邊,每個需要床的人(指外校的人和不回家的人)和s連一條邊,i和j互相認識就把i和j的床連在一起,自己和自己的床肯定連一條邊,然後流量每多1,就表示滿足了乙個人對床的需求,跑最大流就相當於最多能滿足多少人的需求,然後如果最大流大於等於需要床的人數,就可行,否則不可行
#include #include #include #include #include using namespace std;
const int maxn = 1000;
const int inf = 0x3f3f3f3f;
struct edge;
vectoredges;
vectorg[maxn];
int cur[maxn],s,t,n,dep[maxn],vis[maxn];
void addedge(int u,int v,int cap));
edges.push_back((edge));
int cnt=edges.size();
g[u].push_back(cnt-2);
g[v].push_back(cnt-1);
}int dfs(int x,int a)
}return flow;
}queueq;
bool bfs(void)}}
return vis[t];
}int dinic(void)
return flow;
}int cnt,is_stu[maxn],is_stay[maxn];
void init(void)
memset(is_stu,false,sizeof(is_stu));
memset(is_stay,false,sizeof(is_stay));
}int main()
for(int i=1;i<=n;i++)
}for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
}if(dinic()>=cnt)
else
}return 0;
}
P2055 ZJOI2009 假期的宿舍
題目描述 學校放假了 有些同學回家了,而有些同學則有以前的好朋友來探訪,那麼住宿就是乙個問題。比如 a 和 b 都是學校的學生,a 要回家,而 c 來看b,c 與 a 不認識。我們假設每個人只能睡和自己直接認識的人的床。那麼乙個解決方案就是 b 睡 a 的床而 c 睡 b 的床。而實際情況可能非常複...
P2055 ZJOI2009 假期的宿舍
學校放假了 有些同學回家了,而有些同學則有以前的好朋友來探訪,那麼住宿就是乙個問題。比如 a 和 b 都是學校的學生,a 要回家,而 c 來看b,c 與 a 不認識。我們假設每個人只能睡和自己直接認識的人的床。那麼乙個解決方案就是 b 睡 a 的床而 c 睡 b 的床。而實際情況可能非常複雜,有的人...
P2055 ZJOI2009 假期的宿舍
這道題是求二分圖完美匹配。沒看請題意還不知道是求完美匹配,結果爆零。人一共分三種 在校學生 回家。這類人擁有乙個床,但是不睡。在校學生 不回家。這類人擁有乙個床,但也要睡乙個床。有時不一定睡自己的。外來學生。這類人沒床卻想睡覺。顯然要用 2n 的空間來建立人和床。等待匹配的人只有1 3兩種情況,等待...