地址 https://algospot.com/judge/problem/read/NTHLON
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }