求帮调S组T4状压
  • 板块学术版
  • 楼主老子是北瓜
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/27 23:45
  • 上次更新2023/11/2 11:09:03
查看原帖
求帮调S组T4状压
121813
老子是北瓜楼主2023/10/27 23:45

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;
}

2023/10/27 23:45
加载中...