Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <queue>
- #define NMax 100010
- #define pb push_back
- #define INF 0x3f3f3f3f
- using namespace std;
- int n, m, k, u, v, sol, used[NMax];
- bool relaxed[4 * NMax];
- long long cost[4 * NMax], d[NMax], x;
- priority_queue<pair<int, long long>> Q;
- vector<pair<int, int>> G[NMax];
- int main() {
- cin >> n >> m >> k;
- for (int i = 0; i < m; i++) {
- cin >> u >> v >> x;
- G[u].pb(make_pair(v, i));
- G[v].pb(make_pair(u, i));
- cost[i] = x;
- }
- for (int i = 0; i < k; i++) {
- cin >> u >> x;
- G[1].pb(make_pair(u, m + i));
- G[u].pb(make_pair(1, m + i));
- cost[m + i] = x;
- }
- for (int i = 1; i <= n; i++) {
- d[i] = INF;
- used[i] = -1;
- }
- d[1] = 0;
- Q.push(make_pair(1, 0));
- while (!Q.empty()) {
- int nod = Q.top().first;
- long long dist = -Q.top().second;
- Q.pop();
- if(dist > d[nod]) {
- continue;
- }
- for (auto x : G[nod]) {
- int adj = x.first;
- int edge = x.second;
- if (d[adj] > dist + cost[edge]) {
- d[adj] = dist + cost[edge];
- used[adj] = edge;
- Q.push(make_pair(adj, -d[adj]));
- } else if (d[adj] == dist + cost[edge] && edge < m) {
- used[adj] = edge;
- }
- }
- }
- for (int i = 1; i <= n; i++) {
- if (used[i] != -1) {
- relaxed[used[i]] = true;
- }
- }
- for (int i = m; i < m + k; i++) {
- if (!relaxed[i]) {
- sol++;
- }
- }
- cout << sol << '\n';
- return 0;
- }
- close
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement