#include<bits/stdc++.h>
using namespace std;
class Graph
{
int V;
list<pair<int,int>> *l;
public:
Graph(int v)
{
V = v;
l = new list<pair<int,int>> [V+1];
}
void addEdge(int u, int v,int cost)
{
l[u].push_back(make_pair(v,cost));
l[v].push_back(make_pair(u,cost));
}
int dfsHelper(int node,bool *visited, int *count, int &ans)
{
//mark the node as visited
visited[node] = true;
count[node] = 1;
for (auto nbr_pair:l[node])
{
int nbr = nbr_pair.first;
int wt = nbr_pair.second;
if (!visited[nbr])
{
// the count of node increases as we return from the children node
count[node] += dfsHelper(nbr,visited,count,ans);
//That count helps us to find the number of nodes of that component
int nx = count[nbr];
int ny = V - nx;
// ans is added to the variable ans
ans += 2*min(nx,ny) * wt;
}
}
// Just before leaving the node parent
return count[node];
}
int dfs()
{
/*
If you want to dynamically allocate an array of booleans, you need to do
bool *arr = new bool[10];
You have to specify the array size.
The syntax for static allocation is
bool arr[10];
*/
bool *visited = new bool[V+1];
int *count = new int[V+1];
for(int i=1;i<V+1;i++)
{
visited[i] = false;
count[i] = 0;
}
int ans = 0;
dfsHelper(1,visited,count,ans);
return ans;
}
};
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
int i=1;
while (i<=t)
{
int n;
cin>>n;
Graph g(n);
for (int j=1;j<=n-1;j++)
{
int x,y,z;
cin>>x>>y>>z;
g.addEdge(x,y,z);
}
int req = g.dfs();
cout<<"Case #"<<i<<": "<< req<<endl;
i += 1;
}
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBHcmFwaAp7CiAgICBpbnQgVjsKICAgIGxpc3Q8cGFpcjxpbnQsaW50Pj4gKmw7CgpwdWJsaWM6CiAgICBHcmFwaChpbnQgdikKICAgIHsKICAgICAgICBWID0gdjsKICAgICAgICBsID0gbmV3IGxpc3Q8cGFpcjxpbnQsaW50Pj4gW1YrMV07CiAgICB9CiAgICB2b2lkIGFkZEVkZ2UoaW50IHUsIGludCB2LGludCBjb3N0KQogICAgewogICAgICAgIGxbdV0ucHVzaF9iYWNrKG1ha2VfcGFpcih2LGNvc3QpKTsKICAgICAgICBsW3ZdLnB1c2hfYmFjayhtYWtlX3BhaXIodSxjb3N0KSk7CiAgICB9CgogICAgaW50IGRmc0hlbHBlcihpbnQgbm9kZSxib29sICp2aXNpdGVkLCBpbnQgKmNvdW50LCBpbnQgJmFucykKICAgIHsKICAgICAgICAvL21hcmsgdGhlIG5vZGUgYXMgdmlzaXRlZAogICAgICAgIHZpc2l0ZWRbbm9kZV0gPSB0cnVlOwogICAgICAgIGNvdW50W25vZGVdID0gMTsKCiAgICAgICAgZm9yIChhdXRvIG5icl9wYWlyOmxbbm9kZV0pCiAgICAgICAgewogICAgICAgICAgICBpbnQgbmJyID0gbmJyX3BhaXIuZmlyc3Q7CiAgICAgICAgICAgIGludCB3dCA9IG5icl9wYWlyLnNlY29uZDsKICAgICAgICAgICAgaWYgKCF2aXNpdGVkW25icl0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIHRoZSBjb3VudCBvZiBub2RlIGluY3JlYXNlcyBhcyB3ZSByZXR1cm4gZnJvbSB0aGUgY2hpbGRyZW4gbm9kZQogICAgICAgICAgICAgICAgY291bnRbbm9kZV0gKz0gZGZzSGVscGVyKG5icix2aXNpdGVkLGNvdW50LGFucyk7CgogICAgICAgICAgICAgICAgLy9UaGF0IGNvdW50IGhlbHBzIHVzIHRvIGZpbmQgdGhlIG51bWJlciBvZiBub2RlcyBvZiB0aGF0IGNvbXBvbmVudAogICAgICAgICAgICAgICAgaW50IG54ID0gY291bnRbbmJyXTsKICAgICAgICAgICAgICAgIGludCBueSA9IFYgLSBueDsKICAgICAgICAgICAgICAgIC8vIGFucyBpcyBhZGRlZCB0byB0aGUgdmFyaWFibGUgYW5zCiAgICAgICAgICAgICAgICBhbnMgKz0gMiptaW4obngsbnkpICogd3Q7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEp1c3QgYmVmb3JlIGxlYXZpbmcgdGhlIG5vZGUgcGFyZW50CiAgICAgICAgcmV0dXJuIGNvdW50W25vZGVdOwogICAgfQogICAgaW50IGRmcygpCiAgICB7CiAgICAgICAgLyoKICAgICAgICBJZiB5b3Ugd2FudCB0byBkeW5hbWljYWxseSBhbGxvY2F0ZSBhbiBhcnJheSBvZiBib29sZWFucywgeW91IG5lZWQgdG8gZG8KCiAgICAgICAgICAgIGJvb2wgKmFyciA9IG5ldyBib29sWzEwXTsKICAgICAgICAgICAgWW91IGhhdmUgdG8gc3BlY2lmeSB0aGUgYXJyYXkgc2l6ZS4KCgogICAgICAgIFRoZSBzeW50YXggZm9yIHN0YXRpYyBhbGxvY2F0aW9uIGlzCgogICAgICAgICAgICBib29sIGFyclsxMF07CiAgICAgICAgKi8KCiAgICAgICAgYm9vbCAqdmlzaXRlZCA9IG5ldyBib29sW1YrMV07CiAgICAgICAgaW50ICpjb3VudCA9IG5ldyBpbnRbVisxXTsKCiAgICAgICAgZm9yKGludCBpPTE7aTxWKzE7aSsrKQogICAgICAgIHsKICAgICAgICAgICAgdmlzaXRlZFtpXSA9IGZhbHNlOwogICAgICAgICAgICBjb3VudFtpXSA9IDA7CiAgICAgICAgfQogICAgICAgIGludCBhbnMgPSAwOwogICAgICAgIGRmc0hlbHBlcigxLHZpc2l0ZWQsY291bnQsYW5zKTsKICAgICAgICByZXR1cm4gYW5zOwogICAgfQp9OwoKaW50IG1haW4oKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoMCk7CiAgICBjb3V0LnRpZSgwKTsKICAgIGludCB0OwogICAgY2luID4+IHQ7CiAgICBpbnQgaT0xOwogICAgd2hpbGUgKGk8PXQpCiAgICB7CiAgICAgICAgaW50IG47CiAgICAgICAgY2luPj5uOwogICAgICAgIEdyYXBoIGcobik7CiAgICAgICAgZm9yIChpbnQgaj0xO2o8PW4tMTtqKyspCiAgICAgICAgewogICAgICAgICAgICBpbnQgeCx5LHo7CiAgICAgICAgICAgIGNpbj4+eD4+eT4+ejsKICAgICAgICAgICAgZy5hZGRFZGdlKHgseSx6KTsKICAgICAgICB9CiAgICAgICAgaW50IHJlcSA9IGcuZGZzKCk7CiAgICAgICAgY291dDw8IkNhc2UgIyI8PGk8PCI6ICI8PCByZXE8PGVuZGw7CiAgICAgICAgaSArPSAxOwogICAgfQp9Cg==