P1807 最长路
https://www.luogu.com.cn/problem/P1807
题意
- 设G为有n个顶点的带权有向无环图,G中各顶点的编号为1到n
- 请设计算法,计算图G中 1- n 的最长路径。
想法
-
bfs
-
图用邻接矩阵存贮
-
d[i]记录i结点前的最长路。因此
-
if(mp[t][i]&&d[i]<d[t]+mp[t][i])//如果从队列头到当前结点i有边,但不是最长(即此点的最长路小于队列头最长路加t-i的路径长) { //注意有重复 d[i]=d[t]+mp[t][i];//更新最长路 q.push(i);//进入队列,搜索下一节点 }
-
//P1807 最长路
// Created by majoe on 2020/5/31.
//https://www.luogu.com.cn/problem/P1807
#include <bits/stdc++.h>
using namespace std;
const int maxn=1510;
queue<int>q;//队列
int d[maxn],mp[maxn][maxn];//d[i]记录i结点前的最长路,mp[a][b]存储结点a,b间的路径长
int n,m;
void bfs()
{
memset(d,-1,sizeof(d)); //初始化为-1,便于无解时输出的d[n]为-1
d[1]=0;//但第一个结点前路径长为0
q.push(1);
while(!q.empty())
{
int t=q.front();
q.pop();
for(int i=1;i<=n;i++)
if(mp[t][i]&&d[i]<d[t]+mp[t][i])//如果从队列头到当前结点i有边,但不是最长(即此点的最长路小于队列头最长路加t-i的路径长)
{
//注意有重复
d[i]=d[t]+mp[t][i];//更新最长路
q.push(i);//进入队列,搜索下一节点
}
}
}
int main()
{
cin>>n>>m;
int a,b,v;
for(int i=1;i<=m;i++)
{
cin>>a>>b>>v;
mp[a][b]=max(mp[a][b],v);//如果两点之间有多条连边,只需保留最长边
}
bfs();
cout<<d[n];// 最后一点的最长路
return 0;
}