今天帮舍友做道笔试题,可惜只过了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 */