(最长路径)给定一个有向无环图,每条边长度为 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]