// 邻接表存图#include<bits/stdc++.h>usingnamespace std;
#define int long long#define IOS ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);constint N = 1e5 + 5;
int h[N], e[N], ne[N], idx, ans[N];
voidadd(int a, int b){
e[idx] = b; ne[idx] = h[a]; h[a] = idx++;
}
voiddfs(int x, int d){
if (ans[x]) return;
ans[x] = d;
for (int i = h[x]; i != -1; i = ne[i]) {
int y = e[i];
dfs(y, d); // 递归标记所有邻接点
}
}
voidsolve(){
memset(h, -1, sizeof h);
int n, m; cin >> n >> m;
for (int i = 0; i < m; ++i) {
int a, b; cin >> a >> b;
add(b, a);
}
for (int i = n; i > 0; --i) {
if (!ans[i]) dfs(i, i);
}
for (int i = 1; i <= n; ++i) cout << ans[i] << " ";
}
intmain(){
IOS
int t = 1;
while (t--) {
solve();
}
return0;
}
// vector 存图#include<bits/stdc++.h>usingnamespace std;
#define int long long#define IOS ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);constint N = 1e5 + 5;
vector<int> p[N];
int ans[N];
voiddfs(int x, int d){
if (ans[x]) return;
ans[x] = d;
for (int i = 0; i < p[x].size(); ++i) {
dfs(p[x][i], d);
}
}
voidsolve(){
int n, m; cin >> n >> m;
for (int i = 0; i < m; ++i) {
int a, b; cin >> a >> b;
p[b].push_back(a);
}
for (int i = n; i > 0; --i) {
if (!ans[i]) dfs(i, i);
}
for (int i = 1; i <= n; ++i) cout << ans[i] << " ";
}
intmain(){
IOS
int t = 1;
while (t--) {
solve();
}
return0;
}
Cow Picnic S
题目链接:https://www.luogu.com.cn/problem/P3916 题目大意: 找到所有奶牛都可达的牧场数量。 思路:
我们可以以每头牛所在的牧场为起点,去进行 dfs,对于一个牧场遍历到一次计数器加一,找到遍历次数等于 k 的牧场。这里为了防止环路需要用到 st 数组,用完记得恢复状态。 代码:
#include<bits/stdc++.h>usingnamespace std;
#define int long long#define IOS ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);constint N = 1e5 + 5;
vector<int> p[N];
int c[105];
int cnt[1005];
int ans;
int st[1005]; // 为了防止环路,放个 stvoiddfs(int x){
st[x] = 1; cnt[x]++;
for (int i = 0; i < p[x].size(); ++i) {
if (!st[p[x][i]]) dfs(p[x][i]);
}
}
voidsolve(){
int k, m, n; cin >> k >> n >> m;
for (int i = 1; i <= k; ++i) cin >> c[i];
for (int i = 1; i <= m; ++i) {
int a, b; cin >> a >> b;
p[a].push_back(b);
}
for (int i = 1; i <= k; ++i) {
memset(st, 0, sizeof st);
dfs(c[i]);
}
for (int i = 1; i <= n; ++i) {
if (cnt[i] == k) ans++;
}
cout << ans;
}
intmain(){
IOS
int t = 1;
while (t--) {
solve();
}
return0;
}