Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- #include <set>
- #include <cstdio>
- #include <iostream>
- using namespace std;
- const int INF = 1e6 + 1;
- int main()
- {
- int ntest;
- scanf("%d", &ntest);
- for (int test = 0; test < ntest; ++test)
- {
- int n, m, r;
- int a, b, l;
- int h, t;
- vector<vector<int> > roads;
- vector<int> answers;
- vector<int> vert2id;
- vector<set<int> > prevs;
- vector<int> matches;
- scanf("%d %d %d", &m, &n, &r);
- roads.assign(n, vector<int> (n, INF));
- prevs.assign(n, set<int>());
- vert2id.assign(n, -1);
- for (int i = 0; i < r; ++i) {
- scanf("%d %d %d", &a, &b, &l);
- --a;
- --b;
- roads[b][a] = roads[a][b] = min(roads[a][b], l);
- }
- for (int i = 0; i < n; ++i) {
- roads[i][i] = 0;
- }
- for (int k = 0; k < n; ++k) {
- for (int i = 0; i < n; ++i) {
- for (int j = 0; j < n; ++j) {
- roads[i][j] = min(roads[i][j], roads[i][k] + roads[k][j]);
- }
- }
- }
- bool error = false;
- set<int> ends;
- for (int i = 0; i < m; ++i) {
- scanf("%d %d", &h, &t);
- --h;
- vert2id[h] = i;
- for (int j = 0; j < n; ++j) {
- if (roads[h][j] == t) {
- prevs[j].insert(h);
- ends.insert(j);
- }
- }
- }
- matches.assign(n, -1);
- for (int i = 0; i < m; ++i) {
- int k = 0;
- for (; k < n; ++k) {
- if (prevs[k].size() == 1) {
- break;
- }
- }
- if (k < n) {
- int from = *(prevs[k].begin());
- matches[k] = from;
- for (int j = 0; j < n; ++j) {
- prevs[j].erase(from);
- }
- } else {
- error = true; // greedy failed to find available vertex
- break;
- }
- }
- if (ends.size() != m) { // amount of destinations != amount of starting points
- error = true;
- }
- if (! error) {
- answers.assign(m, -1);
- for (int i = 0; i < n; ++i) {
- if (matches[i] != -1) {
- answers[vert2id[matches[i]]] = i + 1;
- }
- }
- for (int i = 0; i < m; ++i) {
- printf("%d ", answers[i]);
- }
- printf("\n");
- } else {
- printf("-1\n");
- }
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment