万物皆网络流。。。
裸最大流吧
#include <stack>
#include <queue>
#include <cstdio>
#include <cstring>
#define cle(a,b) memset(a,b,sizeof a)
#define lop(i,j,k) for(int i = j;i <= k;i++)
using namespace std;
stack<int>s;
queue<int>q;
int head[27],cnt,u,v,a,lv[27],x,N[26];
char S[10];
struct edge {
int v,next,f;
}e[251];
int min (int a,int b) {
if(a > b)
return b;
return a;
}
void adde (int u,int v,int f) {
e[++cnt].v = v;
e[cnt].next = head[u];
e[cnt].f = f;
head[u] = cnt;
e[++cnt].v = u;
e[cnt].next = head[v];
e[cnt].f = 0;
head[v] = cnt;
}
void readdata () {
a = 0;
cnt = -1;
cle(head,-1);
scanf("%d",&x);
lop(i,1,x) {
scanf("%s",S);
u = N[S[0] - 'A'];
v = N[S[1] - 'A'];
adde(0,5+i,1);
lop(j,u,v)
adde(5+i,j,1);
}
lop(i,1,5)
adde(i,x+6,(scanf("%d",&u),u));
scanf("%s",S);
}
bool bfs () {
while(!q.empty())
q.pop();
cle(lv,0);
q.push(0);
while(!q.empty()) {
u = q.front();
q.pop();
for(int i = head[u];i != -1;i = e[i].next) {
if(!e[i].f)
continue;
v = e[i].v;
if(!lv[v]) {
lv[v] = lv[u] + 1;
if(v == x + 6)
return 1;
q.push(v);
}
}
}
return 0;
}
int dfs (int now,int minf) {
if(now == x + 6)
return 0x3f3f3f3f;
for(int i = head[now];i != -1;i = e[i].next) {
v = e[i].v;
if(lv[v] != lv[now] + 1)
continue;
s.push(i);
if(minf = min(dfs(v,minf),e[i].f))
return minf;
}
s.pop();
return 0;
}
void dinic () {
while(bfs()) {
u = dfs(0,0x3f3f3f3f);
while(!s.empty()) {
v = s.top();
e[v].f -= u;
e[v ^ 1].f += u;
s.pop();
}
a += u;
}
if(a == x)
printf("T-shirts rock!\n");
else printf("I'd rather not wear a shirt anyway...\n");
}
int main () {
N[23] = 4;
N[11] = 3;
N[12] = 2;
N[19] = 5;
N[18] = 1;
while(scanf("%s",S),S[0] == 'S') {
readdata();
dinic();
}
}