Atcoder #2362 Splatter Painting(dfs+优化)

本文介绍了一种针对无向图的高效染色算法。通过离线处理操作并倒序执行,结合DFS深度优先搜索策略,确保每个节点仅被染色一次,并控制时间复杂度在O(10n)范围内。

原题链接(vjudge上的)
这道题的大意是:对于一个无向图,有n个节点和m条边,每个操作将与节点v的距离小于等于d的节点涂为颜色c。 n,m,p<=105 d<=10
给出输入输出样例:
这里写图片描述
这里写图片描述
要解决这道题:我们只需要注意两个点:
1.离线处理操作,将操作倒序进行处理,这样就可以避免一个点被重复染色
2.基于第1点,在dfs时记录该点在被涂色是距离涂色中心点v的距离r,当这个点再次被搜到时,只需判断当前的r是否大于之前记录的r,否则return。
时间复杂度能控制为O(10n) (每个点最多被搜10次)
附上代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 200050
#define add(u,v) (to[++top]=head[u],head[u]=top,w[top]=v)
#define For(x) for(int h=head[x],o=w[h];h;o=w[h=to[h]])
using namespace std;
int n,m,to[maxn],head[maxn],w[maxn],u,v,top;
int a[maxn],b[maxn],c[maxn],co[maxn],r[maxn],q,i;
void dfs(int x,int rg,int col)
{
    if (rg<=r[x]||rg<=0) return;
    r[x]=rg; 
    if (co[x]==0) co[x]=col;
    For(x) dfs(o,rg-1,col);
}
int main()
{
    scanf("%d%d",&n,&m);
    while (m--)
    {
        scanf("%d%d",&u,&v);
        add(u,v); add(v,u);
    }
    scanf("%d",&q);
    for (i=1;i<=q;i++) scanf("%d%d%d",&a[i],&b[i],&c[i]);
    memset(co,0,sizeof(co)); memset(r,0,sizeof(r));
    for (i=q;i>=1;i--) dfs(a[i],b[i]+1,c[i]);
    for (i=1;i<=n;i++) printf("%d\n",co[i]);
    return 0;
}
### 单视角3D重建方法及其与Splatter图像的关系 #### 方法概述 通过单视图进行3D重建的核心在于构建一种能够从二维平面信息推断出三维结构的方法。这种方法通常涉及学习一个映射函数,该函数可以从输入的单一图像预测出对应的深度、法线或其他几何属性[^1]。 具体来说,在提到的技术中,Flash3D 提供了一个高效的解决方案,它可以直接渲染高质量的三维场景图像,并适用于多种复杂环境下的操作 (a),包括室内外不同类型的场景 (b)[^2]。此外,这种技术还具备一定的能力来处理被遮挡的部分(c),这极大地增强了其实际应用价值。 #### 技术特点对比 相比于其他依赖于精确姿态估计的工作如 Dbarf 和 Flowcam 等,当前讨论中的方法并不需要预先知道摄像机的具体位置或方向信息。这意味着它可以避免因错误的姿态而导致的一系列连锁反应——即不良的姿态会影响后续的重建质量,而较差的质量又会进一步干扰新的姿态计算过程[^3]。 更重要的是,这里所描述的新方法展示了即使是在缺乏地面真值(GT)深度数据条件下也能成功训练的可能性。这是通过采用光度损失作为指导信号完成的,这种方式允许使用更加普遍存在的视频资料来进行模型优化而不是受限于特定标注好的数据库资源。 #### 实现细节 为了达到上述目标,整个流程可能包含以下几个方面: - **网络架构设计**: 构建适合此类任务需求的独特神经网络结构,确保能有效提取并转换来自源图片的关键特性。 - **损失函数定义**: 定义合理的评价标准用来衡量生成结果的好坏程度,比如前面提及过的光度误差项可以帮助调整参数直至获得满意的效果[^4]。 - **训练策略制定**: 考虑到真实世界里获取大量带标签样本较为困难这一现实情况, 设计相应的迁移学习或者自监督机制就显得尤为重要了. 下面给出一段简单的伪代码用于说明基本思路: ```python def train_model(input_images, target_views): for epoch in range(num_epochs): predictions = model(input_images) # Compute photometric loss between predicted and actual views photo_loss = compute_photometric_loss(predictions, target_views) total_loss = photo_loss optimizer.zero_grad() total_loss.backward() optimizer.step() return model ``` 此段代码片段展示了一个典型的迭代更新循环,其中包含了前向传播得到预测值以及反向传播修正权重的过程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值