2RE,60pts求调
查看原帖
2RE,60pts求调
1177795
messiuuu楼主2025/1/30 12:58

使用链式前向星方法,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;
}
2025/1/30 12:58
加载中...