P5318 【深基18.例3】查找文献 bfs + dfs遍历图 20行有疑问
作者:
多米尼克領主的致意
,
2024-05-07 14:10:05
,
所有人可见
,
阅读 5
O(n + m)每个点遍历一次
其中20行不注释只能得20分 未知原因
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, M = 1e6 + 10;
int n, m;
int idx;
int h[M];
bool st[M];
struct edge{
int from, to, w;
int ne;
}E[M];
vector<int>e[M];
void init()
{
memset(h, -1, sizeof h);
// for(int i = 1;i <= M;i++)E[i].ne = -1;
idx = 0;
}
void add(int a, int b)
{
E[idx].to = b;
E[idx].ne = h[a];
h[a] = idx++;
}
void dfs(int u)
{
cout << u << " ";
st[u] = true;
for(int i = h[u]; ~i; i = E[i].ne)
{
int j = E[i].to;
if(st[j])continue;
dfs(j);
}
}
void bfs()
{
memset(st, 0, sizeof st);
queue<int>q;
q.push(1);
st[1] = true;
while(q.size())
{
auto t = q.front();
cout << t << " ";
q.pop();
for(int i = h[t]; ~i;i = E[i].ne)
{
int j = E[i].to;
if(st[j])continue;
q.push(j);
st[j] = true;
}
}
}
bool cmp(int x, int y)
{
return x > y;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
init();
cin >> n >> m;
for(int i = 1;i <= m;i++)
{
int x, y;
cin >> x >> y;
e[x].push_back(y);
}
for(int i = 1;i <= n;i++)sort(e[i].begin(), e[i].end(), cmp);
for(int i = 1;i <= n;i++)
{
for(auto x : e[i])
{
add(i, x);
}
}
dfs(1);
cout << endl;
bfs();
return 0;
}