题意:设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j。设w(i,j)为边的长度,请设计算法,计算图G中<1,n>间的最长路径。
思路:拓扑排序求DAG最长路模板
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, m, h[N], cnt, ind[N], dis[N], inq[N];
struct node {
int v, w, net;
} no[N << 1];
void add(int u, int v, int w) {
no[cnt].v = v;
no[cnt].w = w;
no[cnt].net = h[u];
h[u] = cnt++;
}
int main() {
memset(h, -1, sizeof h);
cin >> n >> m;
for(int a, b, v, i = 0; i < m; i++) {
cin >> a >> b >> v;
add(a, b, v), ind[b]++;
}
dis[n] = -1, inq[1] = 1;
queue<int> q;
for(int i = 1; i <= n; i++)
if(!ind[i])
q.push(i);
while(!q.empty()) {
int j = q.front();
q.pop();
for(int i = h[j]; ~i ; i = no[i].net) {
int v = no[i].v;
ind[v]--;
if(inq[j]) {//保证前面边和起始点联通
dis[v] = max(dis[v], dis[j] + no[i].w);
inq[v] = 1;
}
if(!ind[v])
q.push(v);
}
}
cout << dis[n];
return 0;
}