This problem smells like there should be an answer in graph theory, but it doesn't exactly match any of the graph theory problems I know. (Note: this is actually a real-world problem, fictionalized for easier reading)
Imagine that I have a even-numbered group of Chess players at my house. I have plenty of tables and chess sets for everyone to play, but I need to create a "Pairing," (not sure if there is a graph theory term for it) or a list of matchups such that everyone plays someone. The chess players would all like to play someone they have never played before.
If I have a list from each player of who they have played, I can easily construct a graph showing previous matchups. For example, say A has played B and C, and C has played D:
A----B
|
|
C----D
I know that I can match up B/C and A/D to create a pairing.
But if the graph of previous matchups looks like this:
A----B
\ |
\ |
C D
Then I will not be able to create a pairing. B can only play C, which would make A and D (who have already played) play each other.
So, how can I know (via some method other than brute force) whether or not I can create a pairing? It's not a tree or a cycle that I'm looking for, but is there some other graph property I can test for?