Graph 我对拓扑排序感到困惑

Graph 我对拓扑排序感到困惑,graph,topological-sort,Graph,Topological Sort,我对图论和拓扑排序都是新手。我所知道的是,要对某些任务进行拓扑排序,我必须对其运行dfs,然后根据顶点的完成时间对其进行排序。嗯,我试过了。但不知何故,我得到了错误的答案 假设一个有5个顶点和4条边的图,边是,1->2,2->3,1->3,1->5,我的代码在应该给出“1 4 2 5 3”时给出了答案“4 1 5 2 3”。我的代码有什么问题吗?或者我的拓扑排序思想有什么问题吗 这是我的密码 #include<iostream> #include<vector> #inc

我对图论和拓扑排序都是新手。我所知道的是,要对某些任务进行拓扑排序,我必须对其运行dfs,然后根据顶点的完成时间对其进行排序。嗯,我试过了。但不知何故,我得到了错误的答案

假设一个有5个顶点和4条边的图,边是,1->2,2->3,1->3,1->5,我的代码在应该给出“1 4 2 5 3”时给出了答案“4 1 5 2 3”。我的代码有什么问题吗?或者我的拓扑排序思想有什么问题吗

这是我的密码

#include<iostream>
#include<vector>
#include<cstdio>
#include<stack>
#define MAX 100000

using namespace std;

vector<int> adj_list[MAX];
int f[MAX], d[MAX];//discovery time and finishing time
int color[MAX];
int time;
stack<int> stk;

void dfs(int vertex);
void dfs_visit(int u);

int main(void)
{
    freopen("input.txt", "r", stdin);
int vertex, edge;

//I am creating the adjacency list
cin >> vertex >> edge;
for(int i=1; i<=edge; i++)
{
    int n1, n2;
    cin >> n1 >> n2;
    adj_list[n1].push_back(n2);
}

//I am starting the depth-first-search
dfs(vertex);

return 0;
}

void dfs(int vertex)
{
    //If it's 0 then it means white
for(int i=1; i<=vertex; i++)
    if(color[i]==0) dfs_visit(i);


//Here I am printing the vertices
while(stk.size())
{
    cout << stk.top() << " ";
    stk.pop();
}
cout << endl;

return;
}

void dfs_visit(int u)
{
//If it's 1 then it means grey
color[u]=1;
d[u]=++time;

for(int i=0; i<adj_list[u].size(); i++)
{
    int v=adj_list[u][i];
    if(color[v]==0) dfs_visit(v);
}

//If it's 2 then it means black
color[u]=2;
f[u]=++time;

//I am inserting the vertex in the stack when I am finished, searching it
stk.push(u);
}
#包括
#包括
#包括
#包括
#定义最大100000
使用名称空间std;
向量调整列表[MAX];
int f[MAX],d[MAX]//发现时间和完成时间
int-color[MAX];
整数时间;
堆栈stk;
void dfs(int顶点);
取消探访(国际大学);
内部主(空)
{
freopen(“input.txt”,“r”,stdin);
int顶点,边;
//我正在创建邻接列表
cin>>顶点>>边缘;
对于(int i=1;i>n1>>n2;
调整列表[n1]。推回(n2);
}
//我开始深度优先搜索
dfs(顶点);
返回0;
}
无效dfs(整数顶点)
{
//如果是0,则表示白色

对于(int i=1;让陌生人通过检查来发现代码中的错误是无效的。你应该使用调试器逐行检查代码,看看它的行为是否符合你的意图。@OliCharlesworth,对不起。但是你能告诉我这个图的答案是什么吗?请告诉我,这是一个很大的希望。我很困惑d、 你没有任何涉及4的边,那么你怎么能对它显示的位置有任何偏好呢?而且不是
[4,1,5,2,3]< /代码>一个同样有效的排序?1出现在2, 2之前,在3, 1之前,在3之前,1在5之前。@ DSM,据我所知4可以在开始或结束时,它肯定不能在中间,对吗??斯塔克:这个图有许多有效的拓扑排序(15,我的计数)。其中,9个中间有4个,图中没有<代码> 4 <代码>看起来它有3种,有5个地方可以容纳4个,因此15个。因为没有包含4的边(例如:4发生时不重要),它可以在任何地方。