反证法:
步骤:想要证明P
(1)证明!p为F(!P与事实矛盾)
(2)所以p为T,证毕
证明:P为F(P与事实矛盾)
只需找出一种与事实相反具体情况,
就能证明P为F
(要证明P为T则需要P的全部情况均为T,
而要证明P为F则仅需要P的一种情况为F即可)
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
typedef long long LL;
struct Node
{
int id, w;
};
vector<Node> g[N];//邻接表
int dist[N];//当前点到某点的距离
int n;
void dfs(int u, int f, int d)
{
dist[u] = d;
for (auto x : g[u])//遍历邻接表(g[u]之外的结点是当前结点不能一次到达的结点)
{
if (x.id != f)dfs(x.id, u, d+x.w);
}
}
LL f(int len)
{
return 10 * len + (1LL + len) * len / 2;
}
int main()
{
cin >> n;
for (int i = 0; i < n-1; i++)
{
int p, q, d; scanf("%d%d%d", &p, &q, &d);
g[p].push_back({ q,d });
g[q].push_back({ p,d });
//无向图
}
//找到树直径的a端点
dfs(1, -1, 0);
int a = 1;
for (int i = 1; i <= n; i++)
{
if (dist[i] > dist[a])a = i;
}
dfs(a, -1, 0);
//找到树直径的b端点
int b = 1;
for (int i = 1; i <= n; i++)
{
if (dist[i] > dist[b])b = i;
}
int len = dist[b];//因为第二次dfs是以a为起点
//所以dist[b]的含义是a到b的距离
printf("%lld", f(len));
}