Ordering Tasks(优先工作)拓补排序

img


数据太多了不知道怎么处理
这是我的代码:

#include<stdio.h>
#include<string.h>

int map[100000][100000], bo[100000];
  
int main(){
    int num,n,m;
    scanf("%d",&num);
    while(num--){
        scanf("%d%d", &n, &m);
        // Init.
        memset(map, 0, sizeof(map));
        memset(bo, 0, sizeof(bo));
        int cnt = 0;
 
        // Read.
        
        for (int i = 0; i < m; i++){
            int a, b; 
            scanf("%d%d", &a, &b);
            map[b][a] = 1;
        }
 
        // Handle.
        while (cnt < n){
            for (int i = 1; i <= n; i++){
                if (bo[i])    continue;
                int ren=1;
                for (int p = 1; p <= n; p++)
                    if (map[i][p])
                        ren=0;
                if (ren){
                    if (cnt)
                        printf(" ");
                    printf("%d", i);
                    bo[i] = 1;
                    cnt++;
                    for (int t = 1; t <= n; t++) map[t][i] = 0;
                    break;
                }
            }
        }
        printf("\n");
    
    }
    return 0;
}

请问有什么解决方案

#include
#include
#include
#include
#include <memory.h>
using namespace std;

int main() {
int case1, point, num_edge;
cin >> case1;
while(case1--) {
cin >> point >> num_edge;
int a, b;
vector result;
priority_queue<int, vector, greater > readyTasks;
vector task[point+1];
int indegree[point+1];
memset(indegree,0,sizeof(indegree));
for(int i = 0; i < num_edge; i++) {
cin >> a >> b;
indegree[b]++;
task[a].push_back(b);
}

    for(int i = 1; i <= point; i++) {
        if(indegree[i] == 0) {
            readyTasks.push(i);
        }
    }

    while(!readyTasks.empty()) {
        int temp = readyTasks.top();
        readyTasks.pop();
        result.push_back(temp);
        for(auto it = task[temp].begin(); it != task[temp].end(); it++) {
            indegree[*it]--;
            if(indegree[*it] == 0) {
                readyTasks.push(*it);
            }
        }
    }
    for(int i = 0; i < result.size(); i++) {
        cout << result[i] << " ";
    }
    cout << endl;
}
return 0;

}

#include
#include
#include
#include
#include <memory.h>
using namespace std;

int main() {
int case1, point, num_edge;
cin >> case1;
while(case1--) {
cin >> point >> num_edge;
int a, b;
vector result;
priority_queue<int, vector, greater > readyTasks;
vector task[point+1];
int indegree[point+1];
memset(indegree,0,sizeof(indegree));
for(int i = 0; i < num_edge; i++) {
cin >> a >> b;
indegree[b]++;
task[a].push_back(b);
}

    for(int i = 1; i <= point; i++) {
        if(indegree[i] == 0) {
            readyTasks.push(i);
        }
    }

    while(!readyTasks.empty()) {
        int temp = readyTasks.top();
        readyTasks.pop();
        result.push_back(temp);
        for(auto it = task[temp].begin(); it != task[temp].end(); it++) {
            indegree[*it]--;
            if(indegree[*it] == 0) {
                readyTasks.push(*it);
            }
        }
    }
    for(int i = 0; i < result.size(); i++) {
        cout << result[i] << " ";
    }
    cout << endl;
}
return 0;

}

img

可以采用文件输入的形式进行输入,避免重复手动输入