题目
代码
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
#define x first
#define y second
const int N = 110, M = 10110;
int h[N], e[M], ne[M], w[M], idx;
bool st[N];
int n, m;
int dist[N];
int tier[N];
void add(int a, int b, int c)
{e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}
int Dijkstra(int l, int r)
{memset(dist, 0x3f, sizeof dist);memset(st,0,sizeof st);dist[0] = 0;priority_queue<PII, vector<PII>, greater<PII>> heap;heap.push({0, 0});while(heap.size()){auto t = heap.top(); heap.pop();int u = t.y, distance = t.x;if(st[u]) continue;st[u] = true;for(int k = h[u]; ~k; k = ne[k]){int j = e[k];if(tier[j] < l || tier[j] > r) continue;if(dist[j] > distance + w[k]){dist[j] = distance + w[k];heap.push({dist[j], j});}}}return dist[1];
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> m >> n;memset(h, -1, sizeof h);for(int i = 1; i <= n; i++){int a, b, c;cin >> a >> b >> c;tier[i] = b;add(0, i, a);for(int j = 1; j <= c; j++){int t, v;cin >> t >> v;add(t, i, v);}}int res = INT_MAX;for(int i = tier[1] - m; i <= tier[1]; i++){res = min(res, Dijkstra(i, i+m));}cout << res << endl;return 0;
}
感悟
我建立的图不好实现。下次要灵活一点。
我只考虑到局部的等级,没有想到全局,没有想到枚举区间的做法,更对枚举的范围感到意外
我对边数目的把握有问题,下次要从add函数的出现次数上面分析,这样更加实际