题目
题目
代码
#include<iostream>
#include<queue>
#include<vector>
#include<map>
#include<cstdio>
#include<algorithm>
#include<string>
#include<sstream>
#include<list>
#include<cstring>
#include<stack>
#include <iomanip>
using namespace std;
const double esp = 1e-9;
typedef long long ll;
const int inf = 0x3f3f3f3f;
vector<int> v[1010][3];
map<int,int> mp;
int dp[1007][1007],cal[1010][3];
int f[1010],sum[1010];
priority_queue<int,vector<int>,greater<int> > q;
int find(int x){
if(f[x]==x) return f[x];
int tmp=f[x];
f[x]=find(f[x]);
sum[x]=sum[x]^sum[tmp];
return f[x];
}
int main(){
int n,q1,q2;
while(~scanf("%d%d%d",&n,&q1,&q2)){
if(n==0&&q1==0&&q2==0) break;
int all=q1+q2;
mp.clear();
while(q.size()) q.pop();
memset(sum,0,sizeof sum);
memset(dp,0,sizeof dp);
memset(cal,0,sizeof cal);
for(int i=1;i<=all;i++){
f[i]=i;
for(int j=0;j<=1;j++) v[i][j].clear();
}
for(int i=1;i<=n;i++){
int x,y;
char s[10];
scanf("%d%d%s",&x,&y,s);
int f1=find(x);
int f2=find(y);
if(x==y) continue;
f[f2]=f1;
if(sum[x]!=sum[y]&&s[0]=='y'){
sum[f2]=1;
}
else if(sum[x]==sum[y]&&s[0]=='n'){
sum[f2]=1;
}
}
int cnt=0;
for(int i=1;i<=all;i++){
int tmp=find(i);
if(!mp[tmp]) mp[tmp]=++cnt;
cal[mp[tmp]][sum[i]]++;
v[mp[tmp]][sum[i]].push_back(i);
}
dp[0][0]=1;
for(int i=1;i<=cnt;i++){
for(int j=q1;j>=0;j--){
if(j>=cal[i][0]){
dp[i][j]+=dp[i-1][j-cal[i][0]];
}
if(j>=cal[i][1]){
dp[i][j]+=dp[i-1][j-cal[i][1]];
}
}
}
if(dp[cnt][q1]==1){
int tt=q1;
for(int i=cnt;i>=1;i--){
if(dp[i-1][tt-cal[i][0]]==1){
tt-=cal[i][0];
for(int j=0;j<v[i][0].size();j++){
q.push(v[i][0][j]);
}
}
else if(dp[i-1][tt-cal[i][1]]==1){
tt-=cal[i][1];
for(int j=0;j<v[i][1].size();j++){
q.push(v[i][1][j]);
}
}
}
while(q.size()){
printf("%d\n",q.top());
q.pop();
}
printf("end\n");
}
else printf("no\n");
}
return 0;
}