AT2362 [AGC012B] Splatter Painting(思维、dfs染色、剪枝)
AT2362 [AGC012B] Splatter Painting
题意
给一个n个点m条边的无向图,有q次操作 第i次操作,给出v,d,c,把所有到点v的距离不超过d的点都染上颜色c 问最后每个点的颜色 n,
m, q, c <= 100000 d <= 10
数据范围比较大, 我们如果直接暴力dfs,一直修改颜色一定会超时,然而题目要求的是最后的颜色,正难则反,如果我们倒着来染色,就会发现最后染色的就一定是答案,所以我们只需要倒着去dfs染色,如果这个点没有被染过色就染,染过色就过,这样可以省去很大一笔开销,可以过。
还有一个重要的剪枝就是在dfs时记录该点在被涂色是距离涂色中心点v的距离r,当这个点再次被搜到时,只需判断当前的r是否大于之前记录的r,否则return。(dist数组记录的是该点被遍历的时候剩余的步数是多少,如果该点之前被遍历过,并且之前到这里的时候还有5步,而这次又走到了这个点,却只剩下了3步(3 < 5),那么我们已经没有必要继续往下走了,因为下面的能到达的点已经全部被之前染过色了并且还没之前走的远。)
#include<cstdio>
#include<algorithm>
#include<cstring>using namespace std;
const int N = 500007, M = 5000007, INF = 0x3f3f3f3f;int n,m ;
int head[N], ver[M], nex[M], tot;
int ans[N];struct node{int v, d, c;
}a[N];
int dist[N];
void add(int x, int y){ver[tot] = y;nex[tot] = head[x];head[x] = tot ++ ;
}void dfs(int x, int color, int deep){if(!ans[x])ans[x] = color;if(deep == 0 || dist[x] >= deep)return ;dist[x] = deep;//dist数组记录的是x点染过的最远的距离,那么上面这个[dist[x] >= deep] //的剪枝的意思就是如果当前x点染过色的最远距离比当前距离长,那么就返回for(int i = head[x]; ~i; i = nex[i]){int y = ver[i];dfs(y, color, deep - 1);}
}int main(){scanf("%d%d", &n,&m);memset(head, -1, sizeof head);for(int i = 1; i <= m; ++ i){int x, y;scanf("%d%d",&x, &y);add(x, y), add(y, x);}int q;scanf("%d", &q);for(int i = 1; i <= q; ++ i)scanf("%d%d%d", &a[i].v, &a[i].d, &a[i].c);for(int i = q; i >= 1; -- i){dfs(a[i].v, a[i].c, a[i].d);}for(int i = 1; i <= n; ++ i)printf("%d\n", ans[i]);puts("");return 0;
}
AT2362 [AGC012B] Splatter Painting(思维、dfs染色、剪枝)相关推荐
- Atcoder #2362 Splatter Painting(dfs+优化)
原题链接(vjudge上的) 这道题的大意是:对于一个无向图,有n个节点和m条边,每个操作将与节点v的距离小于等于d的节点涂为颜色c.n,m,p<=105n,m,p,d<=10d. 给出输 ...
- AGC012B Splatter Painting
传送门 题意: 给你一个n个节点的简单无向图(无重边.自环),含有m条边.现在有q次操作.初始的时候所有点的颜色都为0. 每一次操作的描述如下:选择一个节点v[i],将与这个节点的距离小于等于d[i] ...
- 【DP】AGC012B Splatter Painting
分析: 很简单的DP水题. 定义DP(i,j)=(x,y)DP(i,j)=(x,y)DP(i,j)=(x,y)表示在i号点,将其周围j个格子全部转化为颜色y,其优先级为x的最优先操作. 只不过有点不同 ...
- AtCoder Grand Round 012B Splatter Painting
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- AtCoder2362 - Splatter Painting - DFS+思维
1.题目描述: B - Splatter Painting Time limit : 2sec / Memory limit : 256MB Score : 700 points Problem St ...
- Splatter Painting
题目链接:Splatter Painting 因为距离很小. 所以,我们可以逆向操作,当前仅当这个点未被染色才去递归子节点.然后如果枚举到这个点,之前一个到过的节点还能到的距离大于当前还能到的距离就r ...
- 2019.11.2图论专题(AtCoder Splatter Painting、President and Roads、Shortest Cycle、ISlands II)
D:AtCoder Grand Contest 012 Splatter Painting 题目描述 Squid喜欢在图中为一些顶点染色(毕竟是鱿鱼 ) 现在有一张由 N 个顶点和 M 条边组成的简单 ...
- stcoder Splatter Painting 记忆化搜索
5647: Splatter Painting 时间限制: 2 Sec 内存限制: 256 MB 提交: 32 解决: 16 [提交] [状态] [讨论版] [命题人:admin] 题目描述 Sq ...
- hdu 4751(dfs染色)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4751 思路:构建新图,对于那些两点连双向边的,忽略,然后其余的都连双向边,于是在新图中,连边的点是能不 ...
最新文章
- [记录]mscorlib recursive resource lookup bug解决方法
- Android构建流程——篇七
- 删除所有的视图,存储过程
- .NET 6新特性试用 | 可写JSON DOM API
- Mybatis中typeAliases标签和package标签
- python会议室系统预定_会议室预定系统
- 4.1 Zend_Config
- Bootstrap Paginator分页插件(mark)
- Linux指令篇:文件系统--fdisk(转)
- Kubernetes网络flannel之host-gw模式分析
- 正则表达式清除空格和html标签中的nbsp;空格
- Vue中过滤器和自定义指令详解
- 一、计算机基础: 特点、数制、编码、组成
- 微信小程序滴滴服务器报错,如何使用mpx框架(滴滴)给微信小程序分包
- IE浏览器代理服务器总是自动打开,取消勾选隔一会又会打开
- Java开发笔记XML报文的解析
- javascript 实现 QQshow
- 翻译科技论文,俄译中怎样效果好
- 谭浩强《C语言程序设计 》习题 6-3
- Sdcard基础使用