Qual_C:树上的三角形
-
总时间限制:
- 4000ms 单个测试点时间限制:
- 2000ms 内存限制:
- 262144kB
-
描述
-
有一棵树,树上有只毛毛虫。它在这棵树上生活了很久,对它的构造了如指掌。所以它在树上从来都是走最短路,不会绕路。它还还特别喜欢三角形,所以当它在树上爬来爬去的时候总会在想,如果把刚才爬过的那几根树枝/树干锯下来,能不能从中选三根出来拼成一个三角形呢?
输入
-
输入数据的第一行包含一个整数 T,表示数据组数。
接下来有 T 组数据,每组数据中:
第一行包含一个整数 N,表示树上节点的个数(从 1 到 N 标号)。
接下来的 N-1 行包含三个整数 a, b, len,表示有一根长度为 len 的树枝/树干在节点 a 和节点 b 之间。
接下来一行包含一个整数 M,表示询问数。
接下来M行每行两个整数 S, T,表示毛毛虫从 S 爬行到了 T,询问这段路程中的树枝/树干是否能拼成三角形。
1 ≤ T ≤ 5
小数据:1 ≤ N ≤ 100, 1 ≤ M ≤ 100, 1 ≤ len ≤ 10000
大数据:1 ≤ N ≤ 100000, 1 ≤ M ≤ 100000, 1 ≤ len ≤ 1000000000
输出
-
对于每组数据,先输出一行"Case #X:",其中X为数据组数编号,从 1 开始。
接下来对于每个询问输出一行,包含"Yes"或“No”,表示是否可以拼成三角形。
样例输入
-
2 5 1 2 5 1 3 20 2 4 30 4 5 15 2 3 4 3 5 5 1 4 32 2 3 100 3 5 45 4 5 60 2 1 4 1 3
样例输出
-
Case #1: No Yes Case #2: No Yes
#include<iostream> #include<cmath> #include<cstring> #include<algorithm> #include<iomanip> #include<queue> #include<stack> #include<vector> #include<set> #include<map> using namespace std; struct edge { int id,len; edge(int i,int l) { id=i,len=l; } }; vector<edge>e[100005]; int d[100005]={0}; int f[100005][2]; int l[55]={0}; void dfs(int father,int x,int dep) { d[x]=dep; for(int i=0;i<e[x].size();++i) { int t=e[x][i].id; if(t==father)continue; f[t][0]=x; f[t][1]=e[x][i].len; dfs(x,t,dep+1); } } int main() { int Test; scanf("%d",&Test); for(int t=1;t<=Test;++t) { int n,m; scanf("%d",&n); for(int i=1;i<=n;++i)e[i].clear(); for(int i=0;i<n-1;++i) { int a,b,len; scanf("%d%d%d",&a,&b,&len); e[a].push_back(edge(b,len)); e[b].push_back(edge(a,len)); } dfs(0,1,0); f[1][0]=0; scanf("%d",&m); printf("Case #%d:\n",t); while(m--) { int s,t,num=0; scanf("%d%d",&s,&t); while(d[s]>d[t]) { l[num++]=f[s][1]; s=f[s][0]; if(num>50)break; } while(d[t]>d[s]) { l[num++]=f[t][1]; t=f[t][0]; if(num>50)break; } while(s!=t) { l[num++]=f[s][1]; s=f[s][0]; l[num++]=f[t][1]; t=f[t][0]; if(num>50)break; } if(num>50) { printf("Yes\n"); continue; } sort(l,l+num); bool flag=false; for(int i=0;i+2<num;++i) { if(l[i]+l[i+1]>l[i+2]) { flag=true; break; } } if(flag) printf("Yes\n"); else printf("No\n"); } } return 0; }