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);
}
}
};