RT,蒟蒻连个状压都不会写了。原本想着好久没写过状压了,写一次练练手,结果死活调不出来。
球球各位dalao帮个忙了orz
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<unordered_map>
#include<unordered_set>
#define line cout<<endl;
#define ran for(int i=1; i<=n; ++i)
#define range(_L,_R) for(int i=_L; i<=_R; ++i)
#define ll long long
#define ull unsigned long long
#define dbg cout<<"ok"<<endl;
#define mod
#define N 5000
using namespace std;
int n;
ll a[N],b[N],c[N],d[N],f[2000000];
vector<int> g[N];
int main()
{
cin>>n;
for(int i=1; i<=n; ++i) cin>>a[i]>>b[i]>>c[i];
for(int i=1; i<=n; ++i) d[i] = a[i] / b[i] + (a[i] % b[i] != 0);
for(int i=1; i<n; ++i)
{
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
memset(f,0x3f,sizeof(f));
f[1] = 1 + d[1];
for(int i=1; i<(1<<n); ++i)
{
if(!(i&1)) continue;
int now = __builtin_popcount(i);
for(int j=1; j<=n; ++j)
{
if(!((1<<(j-1)) & i)) continue;
for(int k:g[j])
{
if((1<<(k-1)) & i) continue;
f[i+(1<<(k-1))] = min(f[i+(1<<(k-1))], max(now+1+d[k], f[i]));
}
}
}
cout<<f[(1<<n)-1];
return 0;
}