今天帮舍友做道笔试题,可惜只过了66.7%,怎么看算法都没有问题,后来想想应该是超时了。

题目如下:

一道阿里笔试题

题目就是给了这么个有向图,然后让你输出总共有几条链,并且输出最长的链的长度。

一道阿里笔试题

我当时想直接DFS统计,从入度为0开始统计,直到叶子节点结束,这是链的个数,最长路顺路就记了。

但是应该是超时了,虽然看不到返回结果,因为我觉得代码没问题。

之前这样写的:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 50;

vector<int> g[maxn];
int in[maxn];
ll cost[maxn];
int cnt = 0; ///有几个叶子节点,就有几条链路
ll ans = 0;
void dfs(int u, int fa, ll sum)
{
    if(g[u].size() == 0) ///到达叶子节点
    {
        cnt++;
        ans = max(ans, sum);
    }
    for(int i = 0; i < g[u].size(); i++)
    {
        int v = g[u][i];
        if(v == fa) continue;
        dfs(v, u, sum + cost[v]);
    }
}
int main()
{
    int n, m;
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= n; i++) scanf("%lld", &cost[i]);
    memset(in, 0, sizeof(in));
    for(int i = 1; i <= m; i++)
    {
        int u, v; scanf("%d %d", &u, &v);
        g[u].push_back(v);
        in[v]++;
    }
    for(int i = 1; i <= n; i++)
    {
        if(!in[i])
        {
            dfs(i, -1, cost[i]);
        }
    }
    printf("%d %lld\n", cnt, ans);
    return 0;
}
/*
5 4
3
2
10
5
7
1 2
3 1
2 5
4 5

*/
Code

相关文章: