求救30分DFS
查看原帖
求救30分DFS
1587483
shmy123楼主2024/12/2 12:09

求救30分DFS

#include <bits/stdc++.h>
using namespace std;
struct edge
{
    int from, to, weight;
    edge(int from = -1, int to = -1, int weight = -1)
    {
        this->from = from;
        this->to = to;
        this->weight = weight;
    }
};

typedef struct matrix_graph
{
    int *mark;
    int **matrix;
    int num_vertex;
    matrix_graph(int num_vertex)
    {
        this->num_vertex = num_vertex;
        matrix = new int *[num_vertex];
        for (int i = 0; i < num_vertex; i++)
        {
            matrix[i] = new int[num_vertex];
        }
        for (int i = 0; i < num_vertex; i++)
        {
            for (int j = 0; j < num_vertex; j++)
            {
                matrix[i][j] = 0;
            }
        }
    }
    edge first_edge(int vertex)
    {
        edge first_edge(-1. - 1, -1);
        for (int i = 0; i < num_vertex; i++)
        {
            if (matrix[vertex][i] != 0)
            {
                first_edge.from = vertex;
                first_edge.to = i;
                break;
            }
        }
        return first_edge;
    }
    edge next_edge(edge pre_edge)
    {
        edge my_edge;
        for (int i = pre_edge.to + 1; i < num_vertex; i++)
        {
            if (matrix[pre_edge.from][i] != 0)
            {
                my_edge.from = pre_edge.from;
                my_edge.to = i;
                break;
            }
        }
        return my_edge;
    }
    void set_edge(int from, int to, int weight = 1)
    {
        matrix[from][to] = weight;
        // matrix[to][from] = weight;
    }
    int *A;

    void travel()
    {
        A = new int[num_vertex];
        for (int i = 0; i < num_vertex; i++)
        {
            A[i] = i;
        }
        this->mark = new int[num_vertex];
        for (int i = 0; i < num_vertex; i++)
        {
            mark[i] = 0;
        }
        for (int i = 0; i < num_vertex; i++)
        {
            if (mark[i] == 0)
            {
                DFS(i);
            }
        }
    }

    void DFS(int start)
    {
        mark[start] = 1;
        for (edge my_edge = first_edge(start); my_edge.to != -1; my_edge = next_edge(my_edge))
        {
            if (mark[my_edge.to] == 0)
            {
                DFS(my_edge.to);
            }
            A[start] = max(A[start], A[my_edge.to]);
        }
    }

    void show_A()
    {
        for (int i = 0; i < num_vertex; i++)
        {
            cout << A[i] + 1 << " ";
        }
    }

} m_grapg;

int main()
{
    int m, n;
    cin >> m >> n;
    m_grapg my_graph(m);
    for (int i = 0; i < n; i++)
    {
        int from, to;
        cin >> from >> to;
        my_graph.set_edge(from - 1, to - 1);
    }
    my_graph.travel();
    my_graph.show_A();
}
2024/12/2 12:09
加载中...