Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define MAX 100005
- #define INF 1e9 * 100005
- using namespace std;
- int n, m, k;
- vector <pair<int, long long> > adj[MAX];
- bool reached[MAX];
- int getSP() {
- vector<long long> dist(MAX, INF);
- priority_queue<pair<long long, int>, vector<pair<long long, int> >, greater<pair<long long, int> > > pq;
- pq.push(make_pair(0, 0));
- dist[0] = 0;
- for (int i = 0; i < k; i++) {
- int s; long long y;
- scanf("%d %lld", &s, &y);
- s--;
- dist[s] = min(dist[s], y);
- if (!reached[s]) {
- reached[s] = true;
- pq.push(make_pair(dist[s], s));
- }
- }
- while (!pq.empty()) {
- int u = pq.top().second;
- pq.pop();
- for (int i = 0; i < adj[u].size(); i++) {
- int v = adj[u][i].first;
- long long w = adj[u][i].second;
- if (dist[v] == INF) {
- dist[v] = dist[u] + w;
- pq.push(make_pair(dist[v], v));
- }
- else if (dist[v] >= dist[u] + w) {
- dist[v] = dist[u] + w;
- reached[v] = false;
- pq.push(make_pair(dist[v], v));
- }
- }
- }
- int ans = k;
- for (int i = 0; i < n; i++)
- if (reached[i])
- ans--;
- return ans;
- }
- int main() {
- scanf("%d %d %d", &n, &m, &k);
- for (int i = 0; i < m; i++) {
- int u, v;
- long long x;
- scanf("%d %d %lld", &u, &v, &x);
- u--, v--;
- adj[u].push_back(make_pair(v, x));
- adj[v].push_back(make_pair(u, x));
- }
- cout << getSP();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement