/* 链表实现 */
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <utility>
using namespace std;
const int maxn=1e5+5,maxm=1e6+5;
int n,m,book[maxm],que[maxm],Front=0,Back=0;
bool flag;
struct NODE {
int u;
int v;
NODE *next;
} a[maxm];
struct LIST {
int num;
NODE *head;
} g[maxn];
void qsort(int L,int R,char uv)
{
int i=L,j=R;
NODE mid=a[(L+R)/2];
if(uv=='u') {
do {
while(a[i].u<mid.u) {
i++;
}
while(a[j].u>mid.u) {
j--;
}
if(i<=j) {
swap(a[i],a[j]);
i++;
j--;
}
} while(i<=j);
if(L<j) {
qsort(L,j,uv);
}
if(i<R) {
qsort(i,R,uv);
}
return;
} else {
do {
while(a[i].v>mid.v) {
i++;
}
while(a[j].v<mid.v) {
j--;
}
if(i<=j) {
if(a[i].u==a[j].u) { //注意!第二遍排序是在u相等的基础上对v排序,
swap(a[i],a[j]);
}
i++;
j--;
}
} while(i<=j);
if(L<j) {
qsort(L,j,uv);
}
if(i<R) {
qsort(i,R,uv);
}
return;
}
return;
}
void Insert(int u,int v)
{
NODE *p=new NODE;
p->v=v;
p->next=g[u].head;
g[u].head=p;
return;
}
void DFS(int u)
{
if(flag==true) {
printf("%d",u);
flag=false;
} else {
printf(" %d",u);
}
book[u]=1;
NODE *p=g[u].head;
while(p!=NULL) {
if(book[p->v]==0) {
DFS(p->v);
}
p=p->next;
}
return;
}
void BFS(int u)
{
printf("%d",u);
que[Back++]=u;
book[u]=1;
while(Front<Back) {
NODE *p=g[que[Front]].head;
while(p!=NULL) {
if(book[p->v]==0) {
printf(" %d",p->v);
que[Back++]=p->v;
book[p->v]=1;
}
p=p->next;
}
Front++;
}
return;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++) {
g[i].num=i;
g[i].head=NULL;
}
for(int i=1; i<=m; i++) {
scanf("%d%d",&a[i].u,&a[i].v);
a[i].next=NULL;
}
qsort(1,m,'u');
qsort(1,m,'v');
for(int i=1; i<=m; i++) {
Insert(a[i].u,a[i].v);
}
flag=true;
DFS(1);
printf("\n");
memset(book,0,sizeof(book));
BFS(1);
printf("\n");
return 0;
}
哪位大佬能帮忙看看,感激不尽!