Problem and constraints
The project turns mixed person attributes into a graph that remains understandable and explorable. Each node can include graduation year, region, operating system, engineering focus, study time, course load, favorite colors, hobbies, and languages. Weighted similarity converts those values into ranked connections, and the user-selected top-N value controls graph fan-out.
The repository's public description defines these top-N relationships as directed: a connection from one person to another does not guarantee the reverse connection. The case study preserves that definition and describes BFS only in terms of the connections the implementation explores; it does not claim that every edge is reciprocal.
Timothy's role
Timothy worked as one member of the five-person software-engineering team. His approved contribution areas are BFS pathfinding, the Qt desktop interface, automated tests, team coordination, and CSV or JSON data ingestion. The finished application is presented as a team result.
Team composition
The source archive names five team members: John, Tim, Dylan, Cat, and Yechan. Work spanned core C++ domain types, similarity and graph algorithms, file and network ingestion, desktop visualization, data management, and tests.
C++ architecture and data flow
The CMake project requires C++17 and separates the reusable core from the optional Qt6 GUI target. Core source files compile into both the desktop application and the GoogleTest executable, allowing algorithm and data behavior to be exercised without the interface.
The Person model and enumerations represent the nine compared attributes. A common PersonReader interface supports concrete CSV and JSON readers. The CSV path parses local files; the JSON path uses cpp-httplib with OpenSSL support to request JSON over HTTP and nlohmann_json to parse the response. A CSV writer persists the in-memory people collection.
PersonHelper coordinates the selected reader, the in-memory person cache, similarity calculation, graph requests, and CSV output. The Qt6 widgets call that core layer for loading, generation, weight changes, connection queries, pathfinding, add/remove actions, and saving.
Similarity graph and breadth-first search
SimilarityCalc compares nine attributes with configurable weights and ranks each person's strongest matches. Graph construction retains the top-N connections requested by the user, producing the directed similarity structure described in the project README.
For pathfinding, the implementation uses a queue and parent tracking. Starting from one person, BFS explores the top-N connections associated with each encountered node, records how each new node was reached, and reconstructs a path when it reaches the destination. Within the connection structure traversed by the implementation, this produces the shortest path in number of edges. Missing people or an unreachable destination return an empty path.
The Qt interface exposes the same operation as “Degrees of Separation” and highlights a returned path on the graph. This keeps the algorithm in the core layer while the GUI handles input, status, and visualization.
Automated tests and engineering tradeoffs
The GoogleTest target compiles against the non-GUI core. The archive includes tests for BFS paths, weighted similarity, person helpers and generation, CSV parsing, person ingestion, CSV writing, JSON parsing, and JSON-to-person conversion.
That separation gives graph and data behavior a direct test path even when Qt6 is unavailable. CMake makes the GUI conditional on Qt6 while still configuring the unit-test executable around the reusable core and its OpenSSL, HTTP, JSON, and GoogleTest dependencies.
