Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
二分匹配 dfs 0ms 水过,分享代码#include <stdio.h> #include <string.h> #include <iostream> #include <stdlib.h> #include <algorithm> #include <vector> using namespace std; const int MAXN = 21; int n; char judge[15], l, r; int link[MAXN][MAXN];//服装所对应的人,link[i][j]表示第i种衣服的第j个人是几号 int visit[6], sum[6]; bool map[MAXN][6];//map[a][b]=1代表a,b顶点有边相连 int count(char x) { if (x == 'S') return 1; else if (x == 'M') return 2; else if (x == 'L') return 3; else if (x == 'X') return 4; else if (x == 'T') return 5; } bool dfs(int a) { int i, j; for (i = 1; i <= 5; i++) { if (map[a][i] == true && visit[i] < sum[i]) { visit[i]++; for (j = 1; j <= sum[i]; j++) { if (link[i][j] == 0 || dfs(link[i][j])) { link[i][j] = a; return true; } } } } return false; } int main() { int i, j, s, e, ans=0; while (1) { scanf("%s", &judge); if (!strcmp(judge, "ENDOFINPUT")) break; scanf("%d", &n); for (i = 1; i <= n; i++) { scanf("%d", &l);//抵消\n scanf("%c%c", &l, &r); s = count(l); e = count(r); for (j = s; j <= e; j++) map[i][j] = true; } for (i = 1; i <= 5; i++) scanf("%d", &sum[i]); for (i = 1; i <= n; i++) { memset(visit, 0, sizeof(visit)); if (dfs(i)) ans++; } scanf("%s", &judge);//twice? if (ans == n) printf("T-shirts rock!\n"); else printf("I'd rather not wear a shirt anyway...\n"); memset(link, 0, sizeof(link)); memset(map, 0, sizeof(map)); ans = 0; } } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator