[二分圖最大匹配]LuoGu P2417 課程
阿新 • • 發佈:2018-06-26
str pla get temp 如果 problem con 輸入輸出格式 int
二分圖最大匹配..裸的 沒有什麽難度 跑一遍就過了 唯一需要考慮的就是 如果n>m的話 我們就直接輸出NO
題目地址LuoGu P2417 課程
題目描述
n個學生去p個課堂,每一個學生都有自己的課堂,並且每個學生只能去一個課堂,題目要求能夠安排每一個課堂都有人嗎?
輸入輸出格式
輸入格式:
第一行是測試數據的個數,
每組測試數據的開始分別是p和n,
接著p行,每行的開始是這個課堂的學生人數m,接著m個數代表該課堂的學生編號
輸出格式:
如果該組數據能夠這樣安排就輸出YES,否則輸出NO。
輸入輸出樣例
輸入樣例#1:
2
3 3
3 1 2 3
2 1 2
1 1
3 3
2 1 3
2 1 3
1 1
輸出樣例#1:
YES
NO
說明
對於100%的數據, n\(\le 100\),\(m\le 20000\)
二分圖最大匹配..裸的 沒有什麽難度 跑一遍就過了 唯一需要考慮的就是 如果n>m的話 我們就直接輸出NO
扔代碼..
//#define fre yes #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 20010 * 2; int curch[maxn]; int head[maxn]; int ver[maxn]; int to[maxn]; bool Vis[maxn]; int n,m,k,tot,ans; template<typename T>inline void read(T&x) { x = 0;char c;int lenp = 1; do { c = getchar();if(c == '-') lenp = -1; } while(!isdigit(c)); do { x = x * 10 + c - '0';c = getchar(); } while(isdigit(c)); x *= lenp; } void addedge(int x,int y) { ver[tot] = y; to[tot] = head[x]; head[x] = tot++; } bool can(int x) { for (int i=head[x];~i;i=to[i]) { int y = ver[i]; if(!Vis[y]) { Vis[y] = 1; if(!curch[y]||can(curch[y])) { curch[y] = x; return 1; } } } return 0; } int main() { read(k); while(k--) { // for (int i=0;i<maxn;i++) { curch[i] = 0;head[i] = -1;ver[i] = 0;to[i] = 0; } memset(curch,0,sizeof(curch)); memset(head,-1,sizeof(head)); memset(ver,0,sizeof(ver)); memset(to,0,sizeof(to)); ans = 0;tot = 0; read(n);read(m); for (int i=1;i<=n;i++) { int x; read(x); for (int j=1;j<=x;j++) { int y; read(y); addedge(i,y); } } if(n > m) { puts("NO"); continue; } for (int i=1;i<=n;i++) { memset(Vis,false,sizeof(Vis)); if(can(i)) ans++; } if(ans == n) puts("YES"); else puts("NO"); } return 0; }
[二分圖最大匹配]LuoGu P2417 課程