也不算题解吧。粘一下A的代码。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define maxn 4010
using namespace std;
struct T{
int n;
vector<int>G[maxn];
bool mark[maxn];
int S[maxn],c;
void init(int n){
this->n=n;
for(int i=0;i<2*n;i++)
G[i].clear();
memset(mark,0,sizeof mark);
}
bool DFS(int x){
if(mark[x^1])return false;
if(mark[x])return true;
mark[x]=true;S[c++]=x;
for(int i=0;i<G[x].size();i++)
if(!DFS(G[x][i]))return false;
return true;
}
void Add(int u,int uval,int v,int vval){
u=u<<1^uval;v=v<<1^vval;
G[u^1].push_back(v);
G[v^1].push_back(u);
}
bool solve(){
for(int i=0;i<n*2;i+=2){
c=0;
if(!DFS(i)){
while(c>0)mark[S[--c]]=false;
if(!DFS(i^1))return false;
}
}return true;
}
void print(int cas){
if(!cas){printf("bad luck\n");return;}
for(int i=1;i<n;i++){
if(i!=1)printf(" ");
printf("%d%c",i,mark[i<<1]?'w':'h');
}printf("\n");
}
}S;
int n,m;
int main(){
while(scanf("%d%d",&n,&m)&&n&&m){
int u,v,uv,vv;char a,b;
S.init(n);S.mark[0]=true;
for(int i=1;i<=m;i++){
scanf("%d%c %d%c",&u,&a,&v,&b);
uv=a=='h',vv=b=='h';
S.Add(u,uv,v,vv);
}
S.print(S.solve());
}
return 0;
}