我正在查看此链接上的代码:
http://codeforces.com/contest/459/submission/7495216
代码是给定有向加权图并且想要找到具有严格增加边的最长路径
任何人都可以帮助我吗?
#include <iostream>
#include <vector>
using namespace std;
const int MAX = 300005;
vector<pair<int, int> > w[MAX];
int dp[MAX], tmp[MAX];
int main()
{
ios::sync_with_stdio(false);
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i++)
{
int u, v, len;
cin >> u >> v >> len;
w[len].push_back(make_pair(u, v));
}
for (int i = 0; i < MAX; i++)
{
for (int j = 0; j < w[i].size(); j++)
{
int u = w[i][j].first, v = w[i][j].second;
tmp[v] = 0;
}
for (int j = 0; j < w[i].size(); j++)
{
int u = w[i][j].first, v = w[i][j].second;
tmp[v] = max(tmp[v], dp[u] + 1);
}
for (int j = 0; j < w[i].size(); j++)
{
int u = w[i][j].first, v = w[i][j].second;
dp[v] = max(dp[v], tmp[v]);
}
}
int ans = 0;
for (int i = 1; i <= n; i++)
ans = max(ans, dp[i]);
cout << ans << endl;
return 0;
}
答案 0 :(得分:0)
对于每个节点,此代码遍历所有传出边。因此,运行时复杂度为O(n * m),其中n是节点数,m是数字边。
编辑:仔细查看数据和代码后,我说复杂度为O(n + m)。第一个和第二个循环遍历所有边,因此O(m)和第三个循环遍历所有节点,因此O(n)。