Description
在一个工程项目里,多项工作可以同时进行。 我们可以用有向无环图表述项目流程,把项目中的事件表述为结点,把活动表述成有权值的边。 现在我们已知项目共有n个事件,起点为1,终点为n,m个活动。 请你计算出这个项目的最早完成时间,也就是起点到收点的最长路径,即关键路径。输入格式
第一行两个整数n和m,代表结点数量和边数量。(1<=n,m<=100) 下面m行,每行3个整数a,b,x,表示点a到点b之间有一条长度为x的有向边。输出格式
一个整数,起点到终点的最长路径.输入样例
4 6 1 2 3 1 3 2 1 4 3 2 3 3 2 4 5 3 4 3输出样例
9
不难理解,一件事完成的最早时间由起点到终点的最长路径决定,也就是关键路径。
这道题在拓扑排序的基础上进行一点点修改即可,可用动态规划的思想。
代码中有详细注释,大家参考参考~
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
using namespace std;
int n,m,d[1005]= {0},e[1005][1005],dp[1005]; //dp动态规划
int main()
{
cin >> n >> m;
int i,x,y,z;
for(i=1; i<=m; i++)
{
cin >> x >> y >> z;
e[x][y]=z;//构建邻接矩阵,赋权值
d[y]++;//入度数+1
}
queue<int>q;
for(i=1; i<=n; i++)
{
if(d[i]==0)//如果入度数为0
q.push(i);//入队
}
while(q.size())
{
int t=q.front();//取队头元素
//cout << t << ' ';
q.pop();//弹出
for(i=1; i<=n; i++) //n个顶点
{
if(e[t][i])
{
dp[i]=max(dp[i],dp[t]+e[t][i]);//求从点1到点i的最长路径
d[i]--;//入度数-1
if(d[i]==0)//如果入度数为0
q.push(i);//入队
}
}
}
cout << dp[n];//输出从起点1到终点n的最长路径
return 0;
}