求最久時間即在無環有向圖裏求最遠路徑
dfs+剪枝優化
從0節點(自己增加的)出發,0到1~n個節點之間的距離爲1,mt[i]表示從0點到第i個節點目前所得的最長路徑
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 1005;
int map[maxn][maxn];
int mt[maxn];
int N, M, ans;
void init()
{
memset(map, 0, sizeof(map));
memset(mt, 0, sizeof(mt));
for(int i = 0; i <= N; i ++)
map[0][i] = 1;
}
void dfs(int rt, int time)
{
for(int i = 1; i <= N; i ++)
{
if(map[rt][i] != 0 && time+map[rt][i] > mt[i]) // 剪枝優化部分
{
mt[i] = time+map[rt][i]; // mt[i]表示進行完第i個節點所需要的目前最久時間
ans = max(ans, mt[i]);
dfs(i, mt[i]);
}
}
}
int main()
{
int a, b, c;
while(scanf("%d%d", &N, &M) != EOF)
{
init();
for(int i = 0; i < M; i ++)
{
scanf("%d%d%d", &a, &b, &c);
a ++; b ++;
map[a][b] = c;
}
ans = 0;
dfs(0, 0);
printf("%d\n", ans);
}
return 0;
}