图论
这是一道图论的基础题,也是模板题,在很多比赛中都很常见,大家可以先看看洛谷题目
题目描述
设 G 为有 nn 个顶点的带权有向无环图,G 中各顶点的编号为 1 到 n,请设计算法,计算图 G 中 <1,n><1,n> 间的最长路径。
输入格式
输入的第一行有两个整数,分别代表图的点数 n 和边数 m。
第 22 到第 (m + 1)行,每行 3 个整数 u,v,w,代表存在一条从 u 到 v 边权为 w 的边。
输出格式
输出一行一个整数,代表 1 到 n 的最长路。
若 1 与 n 不联通,请输出 -1。
输入输出样例
输入
2 1
1 2 1
输出
1
本题用到的算法
用到了三种算法,BFS(广度优先搜索)、邻接表、拓扑排序
解题思路
题目求1~n的最长路,就知道了起点和终点的位置,如果起点和终点直接没有连接,直接输出-1;
我们用一个数组d[i]用来保存答案,即1到i的最长路
用二维数组来存入数据dist[i][j] 即i到j直接有连线,且计入权值
我们还要用一个队列来保存走到当前点queue q
代码
using namespace std;
int dist[1600][1600];
int d[1600];
queue<int> v;
int n, m;
void dfs()
{
memset(d, -1, sizeof d);//把所有点距离变成-1,方便标记
d[1] = 0;//第一个点是没有距离的
v.push(1);
while (v.size())
{
auto t = v.front();
v.pop();
for (int i = 1; i <= n; i++) {
if (dist[t][i] && d[i] < d[t] + dist[t][i]) {//更新答案
d[i] = d[t] + dist[t][i];
v.push(i);//进入下一个点
}
}
}
}
int main()
{
cin >> n >> m;
for (int i = 0; i < m; i++)
{
int a, b, c;
cin >> a >> b >> c;
dist[a][b] = max(dist[a][b], c);//直接保存最大边
}
dfs();
cout << d[n] << endl;
return 0;
}