使用链式前向星方法,2,5点RE求调
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
const int N = 1e6 + 5;
using namespace std;
int e[N], ne[N], idx, h[N], st[N], flag[N];
int n, m;
void add(int x,int y)
{
e[idx] = y;
ne[idx] = h[x];
h[x] = idx ;
idx++;
}
void DFS(int u)
{
printf("%d ",u);
st[u] = 1;
for(int i = h[u]; i != -1; i = ne[i])
{
int v = e[i];
if(!st[v])
{
DFS(v);
}
}
}
void BFS(int u)
{
//printf("%d ",u);
queue<int> q;
q.push(u);
st[u] = 1;
while(!q.empty())
{
int k = q.front();
if(st[k] == 1) printf("%d ",k);
q.pop();
for(int i = h[k]; i != -1; i= ne[i])
{
if(st[e[i]] == 0)
{
st[e[i]] = 1;
q.push(e[i]);
}
}
}
}
void sortGraph()
{
for (int i = 1; i <= n; ++i) {
// 使用一个临时的vector存储邻接点
vector<int> neighbors;
for (int j = h[i]; j != -1; j = ne[j]) {
neighbors.push_back(e[j]);
}
// 对邻接点按目标顶点排序
sort(neighbors.begin(), neighbors.end());
// 将排序后的邻接点重新赋值回链表
h[i] = -1;
for (int j = neighbors.size() - 1; j >= 0; --j) {
add(i, neighbors[j]);
}
}
}
int main()
{
cin >> n >> m;
memset(h, -1, sizeof(h));
while(m--)
{
int x, y;
cin >> x >> y;
add(x, y);
flag[x] = 1;
}
sortGraph();
for(int i = 0; i < n; i++)
{
if(flag[i] == 1)
{
DFS(i);
printf("\n");
memset(st, 0, sizeof(st));
BFS(i);
break;
}
}
// for(int i = 0; i < n; i++)
// {
// for(int j = h[i]; j != -1; j = ne[j])
// {
// printf("%d ",e[j]);
// }
// printf("\n");
// }
return 0;
}