该代码的复杂性是什么?

时间:2016-01-27 18:48:01

标签: c++ time-complexity

我正在查看此链接上的代码:
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;
}

1 个答案:

答案 0 :(得分:0)

对于每个节点,此代码遍历所有传出边。因此,运行时复杂度为O(n * m),其中n是节点数,m是数字边。

编辑:仔细查看数据和代码后,我说复杂度为O(n + m)。第一个和第二个循环遍历所有边,因此O(m)和第三个循环遍历所有节点,因此O(n)。