P1807 最长路

最长路

题目描述

G G G 为有 n n n 个顶点的带权有向无环图, G G G 中各顶点的编号为 1 1 1 n n n,请设计算法,计算图 G G G 1 , n 1, n 1,n 间的最长路径。

输入格式

输入的第一行有两个整数,分别代表图的点数 n n n 和边数 m m m

2 2 2 到第 ( m + 1 ) (m + 1) (m+1) 行,每行 3 3 3 个整数 u , v , w u, v, w u,v,w u < v uu<v),代表存在一条从 u u u v v v 边权为 w w w 的边。

输出格式

输出一行一个整数,代表 1 1 1 n n n 的最长路。

1 1 1 无法到达 n n n,请输出 − 1 -1 1

样例 #1

样例输入 #1

2 1
1 2 1

样例输出 #1

1

提示

【数据规模与约定】

  • 对于 20 % 20\% 20%的数据, n ≤ 100 n \leq 100 n100 m ≤ 1 0 3 m \leq 10^3 m103
  • 对于 40 % 40\% 40% 的数据, n ≤ 1 0 3 n \leq 10^3 n103 m ≤ 1 0 4 m \leq 10^{4} m104
  • 对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 1500 1 \leq n \leq 1500 1n1500 0 ≤ m ≤ 5 × 1 0 4 0 \leq m \leq 5 \times 10^4 0m5×104 1 ≤ u , v ≤ n 1 \leq u, v \leq n 1u,vn − 1 0 5 ≤ w ≤ 1 0 5 -10^5 \leq w \leq 10^5 105w105
#include
using namespace std;
#define il inline
const int MAXN=5e5+5;
int dis[MAXN],w[MAXN],n,m,minn,f[MAXN][3];

//Bellman-Ford
il void BellmanFord()
{
	memset(dis,0x3f,sizeof(dis));
	dis[1]=0;
	for(int i=1;i<=n-1;i++)
        for(int j=1;j<=m;j++)
            dis[f[j][2]]=min(dis[f[j][2]],dis[f[j][1]]+w[j]);
	return;
}
//

int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
        f[i][1]=f[i][2]=0;
    memset(w,0x3f,sizeof(w));
    for(int i=1;i<=m;i++)
	{
        int u,v,ww;
        cin>>u>>v>>ww;
        f[i][1]=u,f[i][2]=v,w[i]=-ww;
    }
    BellmanFord();
    if(dis[n]!=0) printf("%d",-dis[n]);
    else printf("-1");
    return 0;
}

bellmanford的同时注意以下几点
1.把最长边转换为最短边(也就是取负值)

2.跑一遍最短路模板

3.最后的答案在取负回来

你可能感兴趣的:(算法)