关于不懂的,这题考的就是树,直接画图就ok了。注意最后根结点的的儿子节点是没有更新为最后合成根结点的数量*本身的权值的,本身只代表一个权值。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
typedef long double ldb;
typedef pair<int, int> pii;
typedef pair<ll, ll> PII;
#define pb emplace_back
//#define int ll
#define all(a) a.begin(),a.end()
#define ps push_back
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define lc u << 1
#define rc u << 1 | 1
void solve();
const int N = 1e6 + 10;
signed main() {
IOS;
ll t = 1;
cin >> t;
while (t--)
solve();
return 0;
}
const ll maxn = 1e9 + 100;
struct eage{ll v,ne;};
vector<eage> e(N);
vector<ll> h(N,-1);
vector<ll> w(N,0);//存储每个节点的权值,节点是唯一的
vector<ll> s(N,0);
vector<ll> vis(N,0);
ll n=0, k=0, idx=0;
void init()
{
for(int i = 0; i <= idx; ++ i)
e[i].v = e[i].ne = 0;
idx = 0;
for(int i = 0; i <= n; ++ i)
{
h[i] = -1;
vis[i] = s[i] = w[i] = 0;
}
}
void add(ll u,ll v)
{
e[idx] = {v,h[u]};
h[u] = idx ++;
}
void dfs(ll u,ll fa)
{
for(int i = h[u]; ~ i; i = e[i].ne)
{
ll v = e[i].v;
if(v == fa) continue;
dfs(v,u);
w[u] += w[v] * s[v];
if(w[u] > maxn) w[u] = maxn;
}
}
void solve() {
init();
cin >> n >> k;
for(int i = 1; i <= n; ++ i)
{
ll p; cin >> p;
if(p==1)// p == 1
{
ll t,v,num;
cin >> t;
while(t--)
{
cin >> num >> v;
s[v] = num;
add(i,v);
}
}
else
{
ll wx; cin >> wx;
w[i] = wx;
}
}
dfs(k,0);
vector<ll> sb;
for(int i = h[k]; ~ i; i = e[i].ne)
{
ll v = e[i].v;
sb.ps(w[v]*s[v]);
}
if(sb.size() == 1)
{
cout << 0 << endl; return;
}
sort(all(sb));
ll sum = 0;
for(int i = 0; i <= sb.size() - 1 - 1; ++ i)// 1 - n-1
{
sum += sb[i];
if(sum > 1e9)
{
cout << "Impossible" << endl;
return;
}
}
cout << sum << endl;
}