Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define INF 1e9
- #define MAX_V 10000
- using namespace std;
- typedef pair<int,int> ii;
- typedef vector<ii> vii;
- int n, m, q, s, u, v, w, dist[MAX_V];
- vector<vii> adj;
- int main() {
- while(scanf("%d%d%d%d",&n,&m,&q,&s),n + m + q + s) {
- adj.assign(n,vii());
- for(int i = 0; i < m; i++) {
- scanf("%d%d%d",&u,&v,&w);
- adj[u].push_back(ii(v,w));
- }
- fill(dist,dist + MAX_V,INF);
- dist[s] = 0;
- priority_queue<ii,vii,greater<ii>> pq;
- pq.push(ii(dist[s],s));
- while(!pq.empty()) {
- ii cur = pq.top(); pq.pop();
- int cur_weight = cur.first;
- int cur_node = cur.second;
- for(auto &x : adj[cur_node]) {
- if(dist[x.first] > cur_weight + x.second) {
- dist[x.first] = cur_weight + x.second;
- pq.push(ii(dist[x.first],x.first));
- }
- }
- }
- for(int i = 0; i < q; i++) {
- scanf("%d",&u);
- if(dist[u] == INF) {
- printf("Impossible\n");
- } else {
- printf("%d\n",dist[u]);
- }
- }
- printf("\n");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement