(最长路径)给定一个有向无环图,每条边长度为1,求图中的最长路径长度。(第五空2分,其余3分)
输入:第一行是结点数n(不超过100)和边数m,接下来m行,每行两个整数a,b,表示从结点a到结点b有一条有向边。结点标号从0到(n-1)。
输出:最长路径长度。
提示:先进行拓扑排序,然后按照拓扑序计算最长路径。
#include
using namespace std;
int n, m, i, j, a, b, head, tail, ans;
int graph[100][100]; // 用邻接矩阵存储图
int degree[100]; // 记录每个结点的入度
int len[100]; // 记录以各结点为终点的最长路径长度
int queue[100]; // 存放拓扑排序结果
int main() {
\tcin >> n >> m;
\tfor (i = 0; i < n; i )
\t\tfor (j = 0; j < n; j )
\t\t\tgraph[i][j] = 0;
\tfor (i = 0; i < n; i )
\t\tdegree[i] = 0;
\tfor (i = 0; i < m; i ) {
\t\tcin >> a >> b;
\t\tgraph[a][b] = 1;
\t (1) ;
\t}
\ttail = 0;
\tfor (i = 0; i < n; i )
\t\tif ( (2) ) {
\t\t\tqueue[tail] = i;
\t\t\ttail ;
\t\t}
\thead = 0;
\twhile (tail < n - 1) {
\t\tfor (i = 0; i < n; i )
\t\t\tif (graph[queue[head] ][i] == 1) {
\t\t (3) ;
\t\t\t\tif (degree[i] == 0) {
\t\t\t\t\tqueue[tail] = i;
\t\t\t\t\ttail ;
\t\t\t\t}
\t\t\t}
\t (4) ;
\t}
\tans = 0;
\tfor (i = 0; i < n; i ) {
\t\ta = queue[i];
\t\tlen[a] = 1;
\t\tfor (j = 0; j < n; j )
\t\t\tif (graph[j][a] == 1 && len[j] 1 > len[a])
\t\t\t\tlen[a] = len[j] 1;
\t\tif ( (5) )
\t\t\tans = len[a];
\t}
\tcout << ans << endl;
\treturn 0;
}
发表评论 取消回复