1

私はグラフ理論が初めてで、トポロジカルソートが初めてです。私が知っているのは、いくつかのタスクをトポロジ的にソートするには、dfs を実行してから、終了時間に従って頂点をソートする必要があるということだけです。さて、私はそれを試しました。しかし、どういうわけか私は間違った答えを得ています。

5 つの頂点と 4 つのエッジを持つグラフで、エッジが 1->2、2->3、1->3、1->5 であるとします。 「1 4 2 5 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);
}
4

0 に答える 0