#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <queue> #define N 100100 #define INF 0x7ffffff using namespace std; struct infor { int u,v,w,next,pt; }a[2*N],Map[2*N]; int b[N],level[N],dep[N],pre[N],temp[N]; int dp1[N],dp2[N],sum[N],Top,n; bool check[N],bir[N],inque[N]; int main() { //freopen("data.in","r",stdin); void addeage(int x,int y,int pos); void ra_bfs(int &s,int &e); void DP(int *p); int t,tem=1; scanf("%d",&t); while(t--) { scanf("%d",&n); memset(b,-1,sizeof(b)); Top=1; for(int i=1;i<=n-1;i++) { int x,y,w; scanf("%d %d %d",&x,&y,&w); Map[i].u = x; Map[i].v = y; Map[i].w = w; addeage(x,y,i); addeage(y,x,i); } //求直径 int s=1,e; ra_bfs(s,e); //s->e; ra_bfs(e,s);//e->s Top=0; int point=s; memset(check,false,sizeof(check)); while(true) { dep[Top++] = point; check[point] = true; int k = pre[point]; bir[a[k].pt] = false; if(!pre[point]) { break; } point=a[k].u; } //倒求 DP(dp2); //正求 for(int i=0;i<=Top-1;i++) { temp[i] = dep[Top-1-i]; } for(int i=0;i<=Top-1;i++) { dep[i] = temp[i]; } DP(dp1); //枚举结果 int Min=INF,key; for(int i=1;i<=n-1;i++) { int com; if(bir[i]) { com = (Top-1)*(Map[i].w); }else { int x = Map[i].u; int y = Map[i].v; if(level[x]<level[y]) { com = max(dp1[x],dp2[y])*(Map[i].w); }else { com = max(dp1[y],dp2[x])*(Map[i].w); } } if(com<Min) { Min = com; key = i; } } printf("Case #%d: %d\n",tem++,key); } return 0; } void addeage(int x,int y,int pos) { a[Top].u = x; a[Top].v = y; a[Top].next = b[x]; a[Top].pt = pos; b[x] = Top++; bir[pos] = true; } void ra_bfs(int &s,int &e) { level[s] = 1; queue<int>que; memset(inque,false,sizeof(inque)); que.push(s); inque[s] = true; pre[s] = 0; while(!que.empty()) { int x = que.front(); que.pop(); for(int i=b[x];i!=-1;i=a[i].next) { int y = a[i].v; if(!inque[y]) { pre[y] = i; level[y] = level[x]+1; que.push(y); inque[y] = true; } } } int Max=0; for(int i=1;i<=n;i++) { if(level[i]>Max) { Max = level[i]; e = i; } } } void DP(int *p) { p[dep[0]] = 0; memset(sum,0,sizeof(sum)); for(int i=1;i<=Top-1;i++) { int x = dep[i]; queue<int>que; que.push(x); sum[x] = 1; int Max = 1; while(!que.empty()) { int x = que.front(); que.pop(); for(int i=b[x];i!=-1;i=a[i].next) { int y = a[i].v; if(sum[y]==0&&!check[y]) { sum[y] = sum[x] + 1; Max = max(sum[y],Max); que.push(y); } } } p[x] = max(p[dep[i-1]],i+Max-1); } }