#include <bits/stdc++.h>
using namespace std;
const int mxN = 3e5 + 7;
int n, m, A, B, vis[mxN], vis_cnt = 1, dp[mxN], dsu[mxN], east[mxN], p[mxN];
bool st[mxN];
vector<pair<int,int>> west;
set<int> graph[mxN];
int find(int x) {
return dsu[x] == x ? x : dsu[x] = find(dsu[x]);
}
bool unite(int x, int y) {
x = find(x), y = find(y);
if (x == y) {
return false;
}
if (graph[x].size() < graph[y].size()) {
swap(x, y);
}
graph[x].insert(graph[y].begin(), graph[y].end());
east[x] += east[y];
dsu[y] = x;
return true;
}
void findCycles(int u, int prev) {
if (st[u]) {
while (prev != u) {
unite(u, prev);
prev = p[prev];
}
return;
}
st[u] = true;
p[u] = prev;
vis[u] = vis_cnt;
for (auto v : graph[u]) {
findCycles(find(v), u);
}
st[u] = false;
}
int dfs(int u) {
if (vis[u] == vis_cnt) {
return 0;
}
if (dp[u] != -1) {
return dp[u];
}
vis[u] = vis_cnt;
dp[u] = east[u];
for (auto v : graph[u]) {
dp[u] += dfs(find(v));
}
return dp[u];
}
int32_t main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> m >> A >> B;
map<pair<int,int>,int> pos;
for (int i = 1; i <= n; ++i) {
int x, y;
cin >> x >> y;
pos[{x, y}] = i;
if (!x) {
west.push_back({x, y});
}
else if (x == A) {
east[i] = 1;
}
}
for (int i = 1; i <= n; ++i) {
dsu[i] = i;
}
for (int i = 0; i < m; ++i) {
int u, v, d;
cin >> u >> v >> d;
if (d == 2) {
unite(u, v);
}
else {
graph[find(u)].insert(find(v));
}
}
for (int iter = 0; iter < n + 1; ++iter) {
for (int i = 1; i <= n; ++i) {
if (vis[find(i)] != vis_cnt) {
findCycles(find(i), 0);
}
}
vis_cnt++;
}
memset(dp, -1, sizeof(dp));
sort(west.begin(), west.end(), greater<pair<int,int>>());
for (auto x : west) {
int res = dfs(find(pos[x]));
cout << res << "\n";
++vis_cnt;
}
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
9 ms |
15572 KB |
Output is correct |
2 |
Correct |
8 ms |
15572 KB |
Output is correct |
3 |
Correct |
10 ms |
15572 KB |
Output is correct |
4 |
Correct |
9 ms |
15528 KB |
Output is correct |
5 |
Correct |
8 ms |
15596 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
8 ms |
15572 KB |
Output is correct |
2 |
Incorrect |
9 ms |
15524 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
8 ms |
15572 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
573 ms |
15960 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5042 ms |
18052 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5039 ms |
20524 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5052 ms |
26128 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5037 ms |
27512 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5064 ms |
37432 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5064 ms |
50732 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5035 ms |
44996 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5065 ms |
43032 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |