数学方法|广东工业大学新生赛决赛F题

// by BNU_LZM #include #include #include #include using namespace std; const int maxn = 100000+5; struct Edge { int u, v, d; Edge(int u, int v, int d) : u(u), v(v), d(d) {} }; vector edges; vector G[maxn]; int n, dep[maxn], dis[maxn], f[maxn]; void dfs(int u, int d) { dep[u] = d; for(int i = 0; i < G[u].size(); i++) { Edge &e = edges[G[u][i]]; int v = e.v; if(v == f[u]) continue; dis[v] = e.d; f[v] = u; dfs(v, d+1); } }bool solve(int a, int b) { vector aa; while(a != b) { if(aa.size() >= 50) return true; if(dep[a] > dep[b]) { aa.push_back(dis[a]); a = f[a]; } else { aa.push_back(dis[b]); b = f[b]; } } if(aa.size() < 3) return false; sort(aa.begin(), aa.end()); for(int i = 0; i < aa.size()-2; i++) { if(aa[i]+aa[i+1] > aa[i+2]) return true; } return false; }int main() { freopen("in.txt", "r", stdin); int T; scanf("%d", &T); while(T--) { edges.clear(); for(int i = 1; i <= n; i++) G[i].clear(); scanf("%d", &n); for(int i = 1; i < n; i++) { int u, v, d; scanf("%d%d%d", &u, &v, &d); edges.push_back(Edge(u, v, d)); G[u].push_back(edges.size()-1); edges.push_back(Edge(v, u, d)); G[v].push_back(edges.size()-1); } memset(f, -1, sizeof(f)); dfs(1, 0); int m; scanf("%d", &m); for(int i = 1; i <= m; i++) { int a, b; scanf("%d%d", &a, &b); if(solve(a, b)) printf("Yes\n"); else printf("No\n"); } } return 0; }


    推荐阅读