「杂题乱刷2」CF1354E
1.「杂题乱刷」洛谷P10642.「杂题乱刷」洛谷P22853.「杂题乱刷」洛谷P15444.「杂题乱刷」洛谷P12165.「杂题乱刷」CF1272D6.「杂题乱刷」CF1105C7.「杂题乱刷」洛谷P24268.「杂题乱刷」AT_abc280_e9.「杂题乱刷」AT_abc307_e10.「杂题乱刷」AT_abc208_e11.「杂题乱刷」P868712.「杂题乱刷」洛谷 P183113.「杂题乱刷」ZhengRui 611 【19寒假普转提】树的权14.「杂题乱刷」AT_abc314_e15.「杂题乱刷」AT_abc220_f16.「杂题乱刷」Zheng Rui 327 【2018普转提day17专题】洗17.「杂题乱刷」AT_abc354_f18.「杂题乱刷」 AT_abc285_e19.「杂题乱刷」P881620.「杂题乱刷」AT_abc358_g21.「杂题乱刷」CF1987D22.「杂题乱刷2」CF607B23.「杂题乱刷2」CF1513C24.「杂题乱刷2」CF1183E & CF1183H25.「杂题乱刷2」CF1839E26.「杂题乱刷2」CF1433F
27.「杂题乱刷2」CF1354E
题目链接
CF1354E Graph Coloring (*2100)
解题思路
发现这个东西就是类似于二分图染色的东西。
因为
不妨把
那么我们就相当于是要找到一种方案使得选择每个联通快的黑点或白点,使得最终选择的总节点个数为颜色
这个问题可以轻松用背包来解决。
参考代码
#include<bits/stdc++.h>
using namespace std;
//#define map unordered_map
#define re register
#define ll long long
#define forl(i,a,b) for(re ll (i)=(a);i<=(b);(i)++)
#define forr(i,a,b) for(re ll (i)=(a);i>=(b);(i)--)
#define pii pair<ll,ll>
#define mid ((l+r)>>1)
#define lowbit(x) (x&-x)
#define pb push_back
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl '\n'
#define QwQ return 0;
#define cfy cout<<"YES\n";
#define cfn cout<<"NO\n";
ll _t_;
void _clear(){}
ll n,m;
ll k1,k2,k3;
vector<ll>G[5010];
ll col[5010];
ll x,y;
ll k;
ll a[5010],b[5010];
vector<ll>A[5010],B[5010];
ll dp[5010][5010];
ll ans[5010];
void dfs(ll x,ll fa,ll y)
{
if(y==1)
a[k]++,
A[k].pb(x);
else
b[k]++,
B[k].pb(x);
col[x]=y;
for(auto i:G[x])
if(i!=fa)
{
if(!col[i])
dfs(i,x,3^y);
else if((3^y)!=col[i])
{
cfn;
exit(0);
}
}
}
void solve()
{
_clear();
cin>>n>>m>>k1>>k2>>k3;
forl(i,1,m)
cin>>x>>y,
G[x].pb(y),
G[y].pb(x);
forl(i,1,n)
if(!col[i])
k++,
dfs(i,0,1);
dp[0][0]=1;
forl(i,1,k)
{
forr(j,k2,a[i])
dp[i][j]|=dp[i-1][j-a[i]];
forr(j,k2,b[i])
dp[i][j]|=dp[i-1][j-b[i]];
}
if(dp[k][k2])
{
cfy;
forl(i,1,n)
ans[i]=1;
forr(i,k,1)
{
if(k2-a[i]>=0 && dp[i-1][k2-a[i]])
{
k2-=a[i];
for(auto j:A[i])
ans[j]=2;
}
else if(k2-b[i]>=0 && dp[i-1][k2-b[i]])
{
k2-=b[i];
for(auto j:B[i])
ans[j]=2;
}
else if(dp[i-1][k2])
continue;
else
exit(-1);
}
if(k2>0)
exit(-1);
ll num=0;
forl(i,1,n)
{
if(ans[i]==2)
cout<<2;
else
{
num++;
if(num<=k1)
cout<<1;
else
cout<<3;
}
}
cout<<endl;
}
else
cfn;
}
int main()
{
// freopen("tst.txt","r",stdin);
// freopen("sans.txt","w",stdout);
IOS;
_t_=1;
// cin>>_t_;
while(_t_--)
solve();
QwQ;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?