Skip to content

Commit accf27b

Browse files
committed
srm 194 div 1 1000 sol
1 parent b47d2ce commit accf27b

File tree

1 file changed

+20
-44
lines changed

1 file changed

+20
-44
lines changed

Diff for: IslandFerries.cpp

+20-44
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,16 @@ struct state
1818
{
1919
int pos;
2020
int cost;
21-
vi tickets;
22-
state(int p = 0, int c = 0, vi t = vector<int>(10, 0)){
23-
pos = p;
24-
cost = c;
25-
tickets = t;
26-
}
21+
int tickets;
22+
int nt;
23+
state(int p, int c, int t, int n) : pos(p), cost(c), tickets(t), nt(n) {}
2724
};
2825
bool operator<(state a, state b){
2926
return a.cost > b.cost;
3027
}
3128
int num = 0;
3229
class IslandFerries{
33-
int dfs(int s, vvi &M, vi &vis){
34-
num++;
35-
vis[s] = true;
36-
for(int j = 0; j < 50; j++)
37-
if(!vis[j] && M[s][j] > 0) dfs(j, M, vis);
38-
}
30+
3931
public:
4032
vector <int> costs(vector <string> legs, vector <string> prices) {
4133
num = 0;
@@ -57,54 +49,38 @@ class IslandFerries{
5749
}
5850

5951
vi vis(50, 0);
60-
dfs(0, M, vis);
61-
cout<<"num = "<<num<<endl;
52+
//cout<<"num = "<<num<<endl;
6253
priority_queue<state> Q;
63-
state s;
64-
Q.push(s);
54+
Q.push(state(0, 0, 0, 0));
6555
vi done(50, -1);
66-
int count = 0;
67-
set<pair<int, vi> > visited;
56+
map<pi, int> best;
6857

6958
while(!Q.empty()){
7059
state p = Q.top();
7160
Q.pop();
72-
int pos = p.pos, cost = p.cost;
73-
vi tickets = p.tickets;
61+
int pos = p.pos, cost = p.cost, tickets = p.tickets, nt = p.nt;
62+
//cout<<pos<<" "<<cost<<" "<<tickets<<" "<<tickets<<endl;
63+
pi t = make_pair(pos, tickets);
7464

75-
if(visited.find(make_pair(pos, tickets)) != visited.end()) continue;
76-
visited.insert(make_pair(pos, tickets));
65+
if(best.count(t) != 0 && best[t] <= cost) continue;
66+
best[t] = cost;
7767

78-
if(done[pos] == -1){
79-
done[pos] = cost;
80-
count++;
81-
if(count == num) break;
82-
}
83-
int nt = 0;
84-
for(int t : tickets) if(t > 0) nt++;
68+
if(done[pos] == -1) done[pos] = cost;
8569
//buy more tickets if it is possible
86-
if(nt < 3){
70+
if(nt < 3)
8771
for(int i = 0; i < m; i++)
88-
if(tickets[i] == 0){
89-
tickets[i] = P[pos][i];
90-
Q.push(state(pos, cost+P[pos][i], tickets));
91-
tickets[i] = 0;
92-
}
93-
}
72+
if(!(tickets & (1<<i)))
73+
Q.push(state(pos, cost+P[pos][i], tickets|(1<<i), nt+1));
9474

9575
//Go to some other island utilising any one of the tickets in kitty
9676
for(int i = 0; i < m; i++)
97-
if(tickets[i] > 0){
77+
if(tickets & (1<<i)){
9878
//visit all islands to check if ferry i can help to go from pos to j
9979
for(int j = 0; j < n; j++)
100-
if(M[pos][j] & (1<<i)){
101-
int t = tickets[i];
102-
tickets[i] = 0;
103-
Q.push(state(j, cost, tickets));
104-
tickets[i] = t;
105-
}
80+
if(M[pos][j] & (1<<i))
81+
Q.push(state(j, cost, tickets^(1<<i), nt-1));
10682
}
107-
}
83+
}
10884
return vi(done.begin()+1, done.begin()+n);
10985
}
11086

0 commit comments

Comments
 (0)