一天,我看见题解
后来我重新做的时候
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+1,maxm=1e6+1;
struct EDGE {
int from,to,next;
} e[maxm];
int head[maxn],n,m;
char vis[maxn];
void QuickSort(int L,int R)
{
int mid=(L+R)/2;
int i=L;
int j=R;
do {
while(e[i].to>e[mid].to) {
i++;
}
while(e[j].to<e[mid].to) {
j--;
}
if(i<=j) {
swap(e[i],e[j]);
i++;
j--;
}
} while(i<=j);
if(L<j) {
QuickSort(L,j);
}
if(i<R) {
QuickSort(i,R);
}
}
void DFS(int u)
{
vis[u]='1';
printf("%d ",u);//u已经遍历
for(int i=head[u]; i!=0; i=e[i].next) {
if(vis[e[i].to]=='0') {//邻接的结点没有被遍历
DFS(e[i].to);//就遍历它
}
}
return;
}
void BFS()
{
queue<int> h;
h.push(1);
vis[1]='1';
while(!h.empty()) {
int x=h.front();
h.pop();
printf("%d ",x);
//遍历邻边
for(int i=head[x]; i!=0; i=e[i].next) {
if(vis[e[i].to]=='0') {
h.push(e[i].to);
vis[e[i].to]='1';
}
}
}
return;
}
int main()
{
//输入
scanf("%d%d",&n,&m);
for(int i=1; i<=m; ++i) {
scanf("%d%d",&e[i].from,&e[i].to);
}
//快排
QuickSort(1,m);
//test
// printf("tests:\n");
// for(int i=1; i<=m; ++i) {
// printf("%d %d\n",e[i].from,e[i].to);
// }
// printf("\n\n");
//建图
for(int i=1; i<=m; ++i) {
e[i].next=head[e[i].from];
head[e[i].from]=i;
}
//init
for(int i=1; i<=n; ++i) {
vis[i]='0';
}
//DFS
DFS(1);
printf("\n");
//init
for(int i=1; i<=n; ++i) {
vis[i]='0';
}
//BFS
BFS();
return 0;
}
我跟AC答案差在了哪?请各位大佬帮忙看看,我被卡了一上午了……呜呜