- 算法说明
先对图进行拓扑排序,再从入度的节点开始计算
dilg(v)=max(u,v)∈E{dilg(u)+w(u, v)}
- 源代码
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
#define maxn 100 + 1
#define maxDilg(a, b) (a) > (b) ? (a) : (b)
struct node {
int v, w;
node(int vv, int ww) {
v = vv;
w = ww;
}
};
vector<node> vt[maxn];
int n, m, indegree[maxn], s[maxn], dilg[maxn];
int a, b, c;
bool topologicalSort();
int main() {
memset(indegree, 0, sizeof(indegree));
memset(dilg, 0, sizeof(dilg));
freopen("4.longestPathInDAG.txt", "r", stdin);
scanf("%d%d", &n, &m);
while(m--) {
scanf("%d%d%d", &a, &b, &c);
vt[a].push_back(node(b, c));
indegree[b]++;
}
topologicalSort();
for(int i = 0; i < n; i++) {
int t = s[i];
for(int j = 0; j < vt[t].size(); j++) {
int v = vt[t][j].v;
dilg[v] = maxDilg(dilg[v], dilg[t] + vt[t][j].w);
}
}
printf("%d ", dilg[s[n - 1]]);
return 0;
}
bool topologicalSort() {
int num = 0;
queue<int> q;
for(int i = 1; i <= n; i++) {
if(indegree[i] == 0) {
q.push(i);
}
}
while(!q.empty()) {
int u = q.front();
s[num++] = u;
q.pop();
for(int i = 0; i < vt[u].size(); i++) {
int v = vt[u][i].v;
indegree[v]--;
if(indegree[v] == 0) {
q.push(v);
}
}
}
if(num == n) return true;
else return false;
}
- 数据输入
- 运行结果