(最长路径)给定一个有向无环图,每条边长度为 1,求图

(最长路径)给定一个有向无环图,每条边长度为 1,求图中的最长路径长度。

输入:第一行是结点数 n(不超过 100)和边数 m,接下来 m 行,每行两个整数a,b,表示从结点 a 到结点 b 有一条有向边。结点标号从 0 到 (n−1) 。

输出:最长路径长度。

提示:先进行拓扑排序,然后按照拓扑序计算。

#include <iostream>
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(){
    cin >> n >> m;
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
            graph[i][j] = 0;
    for (i = 0; i < n; i++)
        degree[i] = 0;
    for (i = 0; i < m; i++){
        cin >> a >> b;
        graph[a][b] = 1;
        ___(1)___ ;
    }
    tail = 0;
    for (i = 0; i < n; i++)
        if (___(2)___){
            queue[tail] = i;
            tail++;
        }
    head = 0;
    while (tail < n - 1){
        for (i = 0; i < n; i++)
            if (graph[queue[head]][i] == 1){
                ___(3)___ ;
                if (degree[i] == 0){
                    queue[tail] = i;
                    tail++;
                }
            }
        ___(4)___ ;
    }
    ans = 0;
    for (i = 0; i < n; i++){
        a = queue[i];
        len[a] = 1;
        for (j = 0; j < n; j++)
            if (graph[j][a] == 1 && len[j] + 1 > len[a])
                len[a] = len[j] + 1;
        if (___(5)___)
            ans = len[a];
    }
    cout << ans << endl;
    return(0);
}


答案
第1空:degree[b] = degree[b] + 1
第2空:degree[i] == 0;
第3空:degree[i] == degree[i] - 1
第4空:head = head + 1
第5空:ans < len[a]

题目信息

题号:6671
题型:填空题
难度:普通