Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- ID: alex_pi1
- LANG: C++
- TASK: namenum
- */
- #include <cmath>
- #include <cstdio>
- #define pb push_back
- #define mp make_pair
- #include <queue>
- #include <vector>
- #include <iostream>
- #include <map>
- #include <set>
- #include <algorithm>
- #include <fstream>
- #include <string>
- #define ll long long
- using namespace std;
- vector< pair<long long, long long> > g[1005];
- map<pair<long long, long long>, long long> dists;
- map<pair<long long, long long>, long long> flights;
- long long dist[1005];
- long long ct[1005];
- /* graph */
- /* each g[i] contains vector, vector contains pairs of (destination, distance) */
- int main() {
- freopen("cowroute.in", "r", stdin);
- freopen("cowroute.out", "w", stdout);
- ios::sync_with_stdio(0);
- cin.tie(0);
- long long a, b, n;
- cin >> a >> b >> n;
- /* from a to b, n routes */
- for (long long i=0; i < n; i++) {
- long long cost; long long cities;
- cin >> cost >> cities;
- vector<long long> dests;
- for (long long j=0; j < cities; j++) {
- long long dest;
- cin >> dest;
- dests.pb(dest);
- }
- for (long long j=0; j < cities; j++) {
- for (long long k=j+1; k < cities; k++) {
- if (j != k) {
- if (dists[mp(dests[j], dests[k])] == 0) { dists[mp(dests[j], dests[k])] = cost; flights[mp(dests[j], dests[k])] = abs(j-k); }
- else {
- if (dists[mp(dests[j], dests[k])] > cost) {
- dists[mp(dests[j], dests[k])] = cost;
- flights[mp(dests[j], dests[k])] = abs(j-k);
- }
- else if (dists[mp(dests[j], dests[k])] == cost) {
- flights[mp(dests[j], dests[k])] = min(flights[mp(dests[j], dests[k])], abs(j-k));
- }
- }
- }
- }
- }
- }
- for (long long i=1; i <= 1000; i++) {
- for (long long j=1; j <= 1000; j++) {
- if (dists[mp(i,j)] != 0) { g[i].pb(mp(j, dists[mp(i,j)])); }
- }
- }
- for (long long i=0; i < 1005; i++) {
- dist[i] = 1000000000000;
- ct[i] = 1000000000000;
- }
- dist[a] = 0;
- ct[a] = 0;
- priority_queue< pair<long long, long long>, vector<pair<long long, long long> >, greater<pair<long long, long long> > > pq;
- pq.push(pair<long long, long long>(0, a));
- while (!pq.empty()) {
- pair<long long, long long> frnt = pq.top();
- pq.pop();
- long long dista = frnt.first;
- long long v = frnt.second;
- if (dista > dist[frnt.second]) { continue; }
- for (long long i=0; i < g[v].size(); i++) {
- pair<long long, long long> vs = g[v][i];
- long long distx = vs.first;
- long long vertx = vs.second;
- if (dist[distx] > dista+vertx || (dista + vertx == dist[distx] && ct[v] + flights[mp(v,distx)] < ct[distx])) {
- ct[distx] = ct[v] + flights[mp(v,distx)];
- dist[distx] = dista + vertx;
- pq.push(pair<long long, long long>(dist[distx], distx));
- }
- }
- }
- if (dist[b] == 1000000000000) {
- cout << -1 << " " << -1 << endl;
- }
- else {
- cout << dist[b] << " " << ct[b] << endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment