Codeforces 1244D. Paint the Tree
2024-09-01 13:26:38
首先如果某个点的度数大于 $2$ 那么显然无解
然后考虑点的度数小于等于 $2$ 的情况
发现其实是一条链
一旦确定了链开头的两个点,后面的点的颜色都可以通过之前的点推出
所以直接枚举即可
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=1e5+;
const ll INF=1e18;
int fir[N],from[N<<],to[N<<],cntt;
inline void add(int a,int b) { from[++cntt]=fir[a]; fir[a]=cntt; to[cntt]=b; }
int n,cst[N][],ans[][],col[N],pcol[N],du[N];
vector <int> V;
int main()
{
n=read();
for(int i=;i<;i++)
for(int j=;j<=n;j++) cst[j][i]=read();
for(int i=;i<n;i++)
{
int a=read(),b=read();
add(a,b); add(b,a);
du[a]++; du[b]++;
}
for(int i=;i<=n;i++)
if(du[i]>) { printf("-1\n"); return ; }
int rt=; for(int i=;i<=n;i++) if(du[i]==) { rt=i; break; }
int pre=rt,now=to[fir[rt]]; V.push_back(rt);
while(du[now]>)
for(int i=fir[now];i;i=from[i])
{
int &v=to[i]; if(v==pre) continue;
V.push_back(now); pre=now; now=v; break;
}
V.push_back(now);
ll ans=INF;
for(int i=;i<;i++)
for(int j=;j<;j++) if(i!=j)
{
int len=V.size(); ll res=cst[V[]][i]+cst[V[]][j];
pcol[V[]]=i; pcol[V[]]=j;
for(int k=;k<len;k++)
{
for(int c=;c<;c++)
if(c!=pcol[V[k-]]&&c!=pcol[V[k-]]) pcol[V[k]]=c;
res+=cst[V[k]][pcol[V[k]]];
}
if(res<ans)
for(int k=;k<len;k++) col[V[k]]=pcol[V[k]];
ans=min(ans,res);
}
printf("%lld\n",ans);
for(int i=;i<=n;i++) printf("%d ",col[i]+);
puts(""); return ;
}
最新文章
- 《Head First 设计模式》之策略模式
- df du
- UIDevice通知
- Python xml 解析百度糯米信息
- Makefile的规则
- 为 UWP 应用提供的 .NET 网络 API
- 【原】Comparator和Comparable的联系与区别
- [ACM] HDU 5025 Saving Tang Monk (状态压缩,BFS)
- [转] gdb 查看vector, list, map 内容
- 远程监控 – 应用程序运行状况测量 CSF 博客
- JS判斷文件大小
- eclipse 常用插件 整理
- jQuery选取所有复选框被选中的值并用Ajax异步提交数据
- VS系列控制台闪退解决
- C++线程同步的四种方式(Windows)
- go的包下载失败解决方案
- IOS 设置视图半透明子控件不透明
- 最佳linux文件WINDOWS上传下载方法
- python numpy安装
- getOutputStream与getWriter方法