没想到我这么弱也能帮AcWing找到bug的一天(/ω\) 菜哭....
4
1 2 100
2 3 100
4 2 -200
以上是自己发现的之前代码不能通过的数据,标准答案应该为-100,而AC了的代码得到的结果是0.
自己昨天下午在看y总提高课时,对树的中心和树的最长路径两个题中dfs时d1,d2的初始化不同而产生疑惑,隐约觉得树的中心在到达叶子结点时的处理有点问题,于是昨晚问了y总一个很白痴的问题:
3
1 2 100
2 3 100
4 2 -100
这个case的答案应该是0而标准程序跑出来的答案是100。然而我忘记我的n代表的是结点数不是边数,第一行输入应该是4不是3 (//∇//)\,于是y总很快找到我的问题后,我发现我居然问了一个这么弱智的问题,哎无脸面对y总,敲出GG
今天早上,开始重新看题,还是觉得有问题,于是再次开始寻找bug之路,很幸运的是终于发现了这个bug,于是在自己多次确认之后给y总发了消息,没想到这次真的找到bug啦,不过唯一遗憾的就是当时自己修正后的程序最后一个case过不了,还好最后y总告诉我是最后一个case错了,至此这个问题终于解决了。
跟大家分享一下,也希望大家对每个题目多多思考,能尽量的完善AcWing的case呀!!!!
以下是自己的AC代码,和y总视频里的代码比就只修改了dfs_down这个函数的实现,还有up[1] = -inf;这一条语句,数组chd和视频里的p数组含义相同。
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1e4 + 10, M = N * 2, inf = 0x3f3f3f3f;
int h[N], e[M], w[M], ne[M], idx;
int d1[N], d2[N], up[N], chd[N];
int n;
int add(int a, int b, int c)
{
e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++;
}
int dfs_down(int u, int father)
{
d1[u] = d2[u] = -inf;
for (int i = h[u]; ~i; i = ne[i])
{
int j = e[i];
if (j == father) continue;
int d = dfs_down(j, u);
d = (d == -inf) ? 0 : d;
d += w[i];
if (d >= d1[u])
{
d2[u] = d1[u], d1[u] = d;
chd[u] = j;
}
else if (d > d2[u]) d2[u] = d;
}
return d1[u];
}
int dfs_up(int u, int father)
{
for (int i = h[u]; ~i; i = ne[i])
{
int j = e[i];
if (j == father) continue;
if (j == chd[u]) up[j] = max(d2[u], up[u]) + w[i];
else up[j] = max(d1[u], up[u]) + w[i];
dfs_up(j, u);
}
}
int main()
{
int n1, n2, weight;
cin >> n;
memset(h, -1, sizeof h);
for (int i = 0; i < n - 1; ++i)
{
cin >> n1 >> n2 >> weight;
add(n1, n2, weight);
add(n2, n1, weight);
}
dfs_down(1, -1);
dfs_up(1, -1);
up[1] = -inf;
int ret = inf;
for (int i = 1; i <= n; ++i) ret = min(ret, max(d1[i], up[i]));
cout << ret << endl;
return 0;
}
感觉不太对,我弄了一组 hack 数据
原因是这一段
应该是
d<0
就直接舍掉,令d=0
,这时不选整个子树只保留w[i]
是最优解。大佬好棒,但是y总现在好像把数据弱化了
尴尬了==| 。谢谢夸奖呀,好好加油,有一天你也会找到Acwing的bug滴(逃
厉害,大佬这种善于找错的精神值得大嘎学习%%%%
谢谢大佬鼓励,我会再接再厉的,一起加油V(^_^)V