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;
}