样例通过提交全是WA,爆零求助!
查看原帖
样例通过提交全是WA,爆零求助!
363491
U_92_Uranium楼主2021/8/25 07:36

别人都是用数组邻接表写的,我想尝试一下链表实现:

思路是这样的:先把每组边的起点终点存下来,进行排序(先按起点从小到大排序,再按终点从大大小排序,因为是“头插法”先插的在最后)最后用Insert函数建立邻接表,分别DFS和BFS。

/*    链表实现    */ 
#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;
}

哪位大佬能帮忙看看,感激不尽!

2021/8/25 07:36
加载中...