图的删边游戏:
由于这个图比较特殊,我们推出如果环是奇环,则相当于加一条边,偶数环就相当于删除环,变成一个点。
不会缩环的默默YY了一个多小时才勉强搞定。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<map>
using namespace std;
#define FOR(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define DOR(i,a,b) for(int (i)=(a);(i)>=(b);(i)--)
#define CLR(a) memset((a),0,sizeof((a)))
#define pb push_back
#define mp make_pair
#define ins insert
#define F first
#define S second
#define bug puts("Oh Here!");
#define nMax 2001
#define oo 0x7fffffff
#define eps 1e-8
#define LL long long
#define Vec vector<int>
#define Pai pair<int,int>
class tree{
public:
int first[nMax],to[nMax],nxt[nMax],e,sg[nMax],vis[nMax],in[nMax];
int dfn[nMax],low[nMax],olen;
int adj[510][510];
int n,root;
void clear(){memset(first,-1,sizeof(first));e=0;CLR(adj);}
void addadge(int ,int );
void rebuild();
void dfs(int ,int ,int );
int dfs(int );
int sovle();
};
void tree::addadge(int u,int v){
to[e]=v;nxt[e]=first[u];first[u]=e;e++;
to[e]=u;nxt[e]=first[v];first[v]=e;e++;
}
int tree::dfs(int u){
sg[u]=0;
vis[u]=1;
for(int i=first[u];i!=-1;i=nxt[i])if(!in[to[i]] && !vis[to[i]]){
sg[u] ^= (dfs(to[i])+1);
}
return sg[u];
}
void tree::dfs(int u,int fa,int dep){
//printf("%d ->\n",u);
dfn[u]=low[u]=dep;
vis[u]=1;
for(int i=first[u],v;i!=-1;i=nxt[i]){
v=to[i];
if(vis[v]==1 && v!=fa){
olen = dfn[v]-dfn[u]+1;
low[u]=min(low[u],dfn[v]);
}
if(vis[v]==1 && v==fa && adj[u][v]>1){
olen = 2;
low[u]=min(low[u],dfn[v]);
}
if(!vis[v]){
dfs(v,u,dep+1);
low[u]=min(low[u],low[v]);
}
}
if(low[u]<dfn[u]){
in[u]=1;
}
if(low[u]==dfn[u]){
if(olen&1){
addadge(u,++n);
olen=0;
}
}
vis[u]=2;
//printf("<-\n");
}
void tree::rebuild(){
CLR(in);
CLR(vis);
olen=0;
dfs(root,-1,0);
}
int tree::sovle(){
int m;
scanf("%d%d",&n,&m);
clear();
root=1;
for(int i=0,u,v;i<m;i++){
scanf("%d%d",&u,&v);
if(adj[u][v]==0)
addadge(u,v);
adj[u][v]++;
adj[v][u]++;
}
rebuild();
//FOR(i,1,n) printf("%d %d\n",i,in[i]);
CLR(vis);
dfs(root);
//printf("--%d\n",sg[root]);
return sg[root];
}
tree p;
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
#endif
int t;
while(~scanf("%d",&t)){
int sg=0;
while(t--)
sg ^= p.sovle();
printf("%s\n",sg?"Sally":"Harry");
}
return 0;
}