E题:Non-Decreasing Colorful Path
标签:最短路、
d
i
j
k
s
t
r
a
dijkstra
dijkstra
题意:给定一个
n
n
n个顶点和
m
m
m条边的无向图,每个顶点上有分数
a
i
a_i
ai,求从顶点
1
1
1到顶点
n
n
n得分最高的路径。得分是路径中顶点分数不同的顶点数目,要保证路径上的顶点分数是不递减的(包含等于)
比如路径上顶点的分数分别为
10
10
10
20
20
20
20
20
20
30
30
30
40
40
40=> 那么得分为
4
4
4
题解:比较典型的
d
i
j
k
s
t
r
a
dijkstra
dijkstra的变型题(加上约束条件),因为题目要求不递减,堆优化部分可以按每个顶点的分数从小到大排序,松弛部分操作的时候 保证是从低分数的顶点到高分数(相等也进入更新)的顶点,跑最长路;需要注意处理等于的时候,得分是顶点中分数不同的顶点数目。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[200005], d[200005];
vector<ll> e[200005];
priority_queue< pair<ll, ll> > q;
int main() {
ll n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= m; i++) {
ll u, v;
cin >> u >> v;
e[u].push_back(v);
e[v].push_back(u);
}
d[1] = 1;
q.push(make_pair(-a[1], 1));
while (!q.empty()) {
int u = q.top().second;
q.pop();
for (auto v: e[u]) {
if (a[v] >= a[u]) {
if (d[v] < d[u] + (a[v] != a[u])) {
d[v] = d[u] + (a[v] != a[u]);
q.push(make_pair(-a[v], v));
}
}
}
}
cout << d[n];
return 0;
}