There are N cities in a country, numbered 0 to N-1. Each pair of cities is connected by a bidirectional road.
John plans to travel through the country using the following rules:
He must start in one city and end in another city after travelling exactly N-1 roads.
He must visit each city exactly once.
You are given a String[] roads. If the j-th character of the i-th element of roads is ‘Y’, he must travel the road that connects city i and city j.
For example, if there are three cities, and he wants to travel the road between city 0 and city 1, there are 4 possible paths: 0->1->2, 1->0->2, 2->0->1, 2->1->0. Paths 0->2->1 and 1->2->0 are not allowed because they do not allow him to travel the road between city 0 and city 1.
Return the number of paths he can choose, modulo 1,000,000,007.
#include <string> #include <vector> using namespace std; bool visited[50] = {false}; class HamiltonPath { public: vector <string> roads; int countPaths(vector <string> roads){ int group=0, free=0; int connect[50] = {0}; long long sum = 1; this->roads = roads; for(int i=0; i<roads.size(); i++){ int y = 0; for(int j=0; j<roads[i].size(); j++){ if(roads[i].substr(j, 1) == "Y"){ if( 2 < ++y) return 0; } } connect[i] = y; } for (int i = 0; i<roads.size(); i++){ if(connect[i]==0){ visited[i] = true; free++; } else if(connect[i] == 1 && !visited[i]){ group++; dfs(i); } } for (int i=0; i<roads.size(); i++) if(!visited[i]) return 0; for (int i=0; i<group+free; i++) sum = sum * (i+1) % 100000007; for (int i=0; i<group; i++) sum = sum * 2 % 100000007; return (int)sum; } void dfs(int city){ visited[city] = true; for(int i=0; i < roads[city].size(); i++){ if(road[city].substr(i, 1) == "Y" && !visited[i]) dfs(i); } } };