-
Notifications
You must be signed in to change notification settings - Fork 814
/
Copy path1175. Professional Ability Test (30).cpp
94 lines (93 loc) · 2.61 KB
/
1175. Professional Ability Test (30).cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct node {
int v, score, voucher;
bool operator < (const node &x) const {
if(score != x.score) return score > x.score;
else return voucher < x.voucher;
}
};
struct bian {
int next, S, D;
};
vector<bian> E[1005];
vector<pair<int,int>> Dis(1005, {2e9, -1});
int N, M, T1, T2, S, D, f, T, in[1005], in2[1005], Last[1005];
queue<int> DAG;
int huan() {
vector<int> S;
while(DAG.size()) {
int now = DAG.front();
DAG.pop();
S.push_back(now);
for(auto it : E[now]) {
in2[it.next]--;
if(!in2[it.next]) DAG.push(it.next);
}
}
return S.size() == N;
}
void dijkstra() {
vector<int> vis(1005);
priority_queue<node> Q;
Q.push({1002, 0, 0});
Dis[1002].first = Dis[1002].second = 0;
while(Q.size()) {
node now = Q.top();
Q.pop();
if(vis[now.v]) continue;
vis[now.v] = 1;
Dis[now.v].first = now.score;
Dis[now.v].second = now.voucher;
for (auto it : E[now.v]) {
if(vis[it.next]) continue;
if((Dis[it.next].first > Dis[now.v].first + it.S) || ((Dis[it.next].first == Dis[now.v].first + it.S) && (Dis[it.next].second < Dis[now.v].second + it.D))) {
Dis[it.next].first = Dis[now.v].first + it.S;
Dis[it.next].second = Dis[now.v].second + it.D;
Last[it.next] = now.v;
Q.push({it.next, Dis[it.next].first, Dis[it.next].second});
}
}
}
return;
}
int main() {
cin >> N >> M;
for (int i = 0; i < M; i++) {
cin >> T1 >> T2 >> S >> D;
E[T1].push_back({T2, S, D});
in[T2]++, in2[T2]++;
}
for (int i = 0; i < N; i++) {
if (in[i] == 0) {
E[1002].push_back({i, 0, 0});
DAG.push(i);
}
}
f = huan();
dijkstra();
cin >> T;
if(f) cout << "Okay.\n";
else cout << "Impossible.\n";
for (int i = 1, q; i <= T; i++) {
cin >> q;
if(!in[q]) cout << "You may take test " << q << " directly.\n";
else if(!f) cout << "Error.\n";
else {
vector<int> path;
int now = q;
while(q != 1002) {
path.push_back(q);
q = Last[q];
}
for (int j = path.size() - 1; j >= 0; j--) {
cout << path[j];
if(j) cout << "->";
}
cout << '\n';
}
}
return 0;
}