算法问题实战策略 NTHLON

地址 https://algospot.com/judge/problem/read/NTHLON

 

 

 

 

 

 

  1 #include <iostream>
  2 #include <vector>
  3 #include <algorithm>
  4 #include <queue>
  5 
  6 
  7 using namespace std;
  8 
  9 int V;
 10 //图的邻接表表示法 保存成对(连接的顶点序号 边线加权值)
 11 vector<pair<int, int>> adj[410];
 12 const int START = 401;
 13 const int INF = 0x3f3f3f3f;
 14 
 15 
 16 vector<int> dijkstra(int src)
 17 {
 18     vector<int > dist(V, INF);
 19     dist[src] = 0;
 20     priority_queue<pair<int, int>> pq;
 21     pq.push(make_pair(0, src));
 22 
 23     while (!pq.empty()) {
 24         int cost = -pq.top().first;
 25         int here = pq.top().second;
 26         pq.pop();
 27 
 28         if (dist[here] < cost) continue;
 29 
 30         for (int i = 0; i < adj[here].size(); ++i) {
 31             int there = adj[here][i].first;
 32             int nextDist = cost + adj[here][i].second;
 33 
 34             if (dist[there] > nextDist) {
 35                 dist[there] = nextDist;
 36                 pq.push(make_pair(-nextDist, there));
 37             }
 38         }
 39     }
 40 
 41     return dist;
 42 }
 43 
 44 //==========================================================
 45 
 46 //返回(A国选手的预想耗时-B国家选手的预想耗时)的顶点序号
 47 int vertex(int delta) {
 48     return delta + 200;
 49 }
 50 
 51 //a[]=A国选手的各项预想耗时
 52 //b[]=B国选手的各项预想耗时
 53 int solve(const vector<int>& a, const vector<int>& b) {
 54     //生成图结构
 55     V = 402;
 56     for (int i = 0; i < V; i++) adj[i].clear();
 57     for (int i = 0; i < a.size(); i++) {
 58         int delta = a[i] - b[i];
 59         adj[START].push_back(make_pair(vertex(delta), a[i]));
 60     }
 61 
 62     //当前耗时之差
 63     for (int delta = -200; delta <= 200; ++delta) {
 64         //若添加第i个比赛项目
 65         for (int i = 0; i < a.size(); ++i) {
 66             int next = delta + a[i] - b[i];
 67             //没有必要生成耗时之差超过200的顶点
 68             if (abs(next) > 200) continue;
 69             adj[vertex(delta)].push_back(make_pair(vertex(next), a[i]));
 70         }
 71     }
 72 
 73     vector<int> shortest = dijkstra(START);
 74     int ret = shortest[vertex(0)];
 75     if (ret == INF) return -1;
 76     return ret;
 77 }
 78 
 79 
 80 
 81 
 82 
 83 int main()
 84 {
 85     int n,m;
 86     cin >> n;
 87     while (n--) {
 88         cin >> m;
 89         vector<int> va;
 90         vector<int> vb;
 91         for (int i = 0; i < m; i++) {
 92             int a, b;
 93             cin >> a >> b;
 94             va.push_back(a);
 95             vb.push_back(b);
 96         }
 97         int ret = solve(va, vb);
 98         if (ret != -1) {
 99             cout << ret << endl;
100         }
101         else {
102             cout << "IMPOSSIBLE" << endl;
103         }
104     }
105 
106 
107     return 0;
108 }
View Code

 

posted on 2019-11-23 16:41  itdef  阅读(277)  评论(0编辑  收藏  举报

导航