1630 auto record = unordered_map<int, vector<int>>();
1631 for(
int i = 1; i <= n; i++) {
1632 record.insert(pair(i, vector<int>()));
1634 auto um = unordered_map<int, unordered_set<int>>();
1635 for(
auto edge: edges) {
1636 if(!um.contains(edge[0])) {
1637 auto us = unordered_set<int>();
1639 um.insert(pair(edge[0], us));
1641 um[edge[0]].insert(edge[1]);
1643 if(!um.contains(edge[1])) {
1644 auto us = unordered_set<int>();
1646 um.insert(pair(edge[1], us));
1648 um[edge[1]].insert(edge[0]);
1651 auto pq = priority_queue<status>();
1652 pq.push(status(1, 0));
1655 while(!pq.empty()) {
1656 status current = pq.top();
1658 if(current.position == n) {
1661 prev = current.time;
1663 if(current.time != prev) {
1664 return current.time;
1669 if(record[current.position].empty() || record[current.position].size() == 1 && current.time != *record[current.position].rbegin()) {
1671 record[current.position].push_back(current.time);
1676 for(
int next: um[current.position]) {
1678 if(current.time / change % 2 == 1) {
1680 next_time = (current.time / change + 1) * change + time;
1682 next_time = current.time + time;
1684 auto next_status = status(next, next_time);
1685 if(record[next_status.position].empty() || record[next_status.position].size() == 1 && next_status.time != *record[next_status.position].rbegin()) {
1687 pq.push(next_status);