求助Dalao,我到底做错了什么……
查看原帖
求助Dalao,我到底做错了什么……
363491
U_92_Uranium楼主2021/10/12 11:06

一天,我看见题解

可惜当时没有学过前向星存储

后来我重新做的时候

我的代码:

#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;
}

不知道为什么只得20pts

我跟AC答案差在了哪?请各位大佬帮忙看看,我被卡了一上午了……呜呜

2021/10/12 11:06
加载中...