STABLE - VOI10 - Ổn định

Tác giả: happyboy99x

Ngôn ngữ: C++

#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;

const int N = 10000 + 2;
typedef pair<int, int> ii;
#define TR(v,i) for(typeof((v).begin()) i=(v).begin();i!=(v).end();++i)
int n, m, s, d[N];
unsigned long long c[N];
vector<vector<int> > g;

void enter() {
    scanf("%d%d%d",&n,&m,&s);
    g.resize(n); --s;
    for(int i = 0, u, v; i < m; ++i) {
        scanf("%d%d", &u, &v);
        g[--u].push_back(--v);
    }
}

void editGraph() {
    TR(g, u) {
        sort(u->begin(), u->end());
        u->resize(distance(u->begin(), unique(u->begin(), u->end())));
    }
}

void solve() { //Dijkstra
    memset(d, 0x3f, sizeof d); d[s] = 0; c[s] = 1;
    priority_queue<ii, vector<ii>, greater<ii> > q; q.push(ii(0, s));
    while(!q.empty()) {
        int u = q.top().second, du = q.top().first; q.pop();
        if(du > d[u]) continue;
        TR(g[u], v) {
            if(d[*v] > du + 1) q.push(ii(d[*v] = du + 1, *v)), c[*v] = c[u];
            else if(d[*v] == du + 1) c[*v] += c[u];
        }
    }
    int res = 0;
    for(int u = 0; u < n; ++u) if(d[u] < 0x3f3f3f3f && c[u] >= 2) ++res;
    printf("%d\n", res);
}

int main() {
    enter();
    editGraph();
    solve();
    return 0;
}

Download