求救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();
}