都是一些很裸的二分图最大匹配.
纯当复习了.
POJ 1274
#include #include #include #include using namespace std;#define bug(s) cout<<#s<<"="< <<" "inline int Rint() {int x; scanf("%d", &x); return x;}#define MAXN 500vector G[MAXN];int vis[MAXN];int flag[MAXN]; //0-未盖 / 对应点-已盖int n, m;int dfs(int u){ for(int i=0; i<(int)G[u].size(); i++) { int v = G[u][i]; if(!vis[v]) //未访问 { vis[v] = 1; if(!flag[v] || dfs(flag[v])) //!!不是dfs(v) -> dfs(flag[v]) 对应点 { flag[v] = u; return 1; } } } return 0;}int hungary(){ memset(flag, 0, sizeof(flag)); int ans=0; for(int i=1; i<=n; i++) //集合X中点 1~m { memset(vis, 0, sizeof(vis)); if(dfs(i)) ans++; } return ans;}void print_ans() //输出匹配M{ for(int i=n+1; i<=n+n; i++) //flag[v]=u...v=m+1~n if(flag[i]) //v为盖点,输出对应的匹配边 { printf("%d->%d\n", flag[i], i); }}int main(){ while(scanf("%d%d", &n, &m)==2) { for(int i=1; i<=n; i++) { if(!G[i].empty()) G[i].clear(); } for(int i=1; i<=n; i++) { //bug(i); int v; char ch; int cnt = Rint(); while(cnt--) { v = Rint(); //bug(v); G[i].push_back(v+n); //if(ch == '\n') break; } //cout<
POJ 1469
#include #include #include #include #include #include #include
POJ 2239
这题只要把(星期, 班级)对, hash一下.就行
#include #include #include #include #include #include #include