AtCoder2362 - Splatter Painting - DFS+思维

25 篇文章 0 订阅
2 篇文章 0 订阅

1.题目描述:

B - Splatter Painting


Time limit : 2sec / Memory limit : 256MB

Score : 700 points

Problem Statement

Squid loves painting vertices in graphs.

There is a simple undirected graph consisting of N vertices numbered 1 through N, and M edges. Initially, all the vertices are painted in color 0. The i-th edge bidirectionally connects two vertices ai and bi. The length of every edge is 1.

Squid performed Q operations on this graph. In the i-th operation, he repaints all the vertices within a distance of di from vertex vi, in color ci.

Find the color of each vertex after the Q operations.

Constraints

  • 1N,M,Q105
  • 1ai,bi,viN
  • aibi
  • 0di10
  • 1ci105
  • di and ci are all integers.
  • There are no self-loops or multiple edges in the given graph.

Partial Score

  • 200 points will be awarded for passing the testset satisfying 1N,M,Q2,000.

Input

Input is given from Standard Input in the following format:

N M
a1 b1
:
aM bM
Q
v1 d1 c1
:
vQ dQ cQ

Output

Print the answer in N lines. In the i-th line, print the color of vertex i after the Q operations.


Sample Input 1

Copy
7 7
1 2
1 3
1 4
4 5
5 6
5 7
2 3
2
6 1 1
1 2 2

Sample Output 1

Copy
2
2
2
2
2
1
0

Initially, each vertex is painted in color 0. In the first operation, vertices 5 and 6 are repainted in color 1. In the second operation, vertices 1234 and 5 are repainted in color 2.

2ab7e180230b159d42d35ea7e555b3b0.png


Sample Input 2

Copy
14 10
1 4
5 7
7 11
4 10
14 7
14 3
6 14
8 11
5 13
8 3
8
8 6 2
9 7 85
6 9 3
6 7 5
10 3 1
12 9 4
9 6 6
8 2 3

Sample Output 2

Copy
1
0
3
1
5
5
3
3
6
1
3
4
5
3

The given graph may not be connected.

2.题意概述:

给一个包含N个顶点,M条边,无自环和重边的简单无向图,初始每个点颜色都为0,每条边的长度为1,连接着ai,bi两个节点。经过若干个操作,

每次将与某个点vi距离不超过di的所有点染成某种颜色ci,求最终每个点的颜色。

3.解题思路:

反过来做,染色过的点就不再染色
对于点u来说,如果以它为中心,距离为d的所有点都被染色过,那么下次你要对u距离为d’ (d’<d) 的点染色时就可以直接退出了

4.AC代码:

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define maxn 100100
#define lson root << 1
#define rson root << 1 | 1
#define lent (t[root].r - t[root].l + 1)
#define lenl (t[lson].r - t[lson].l + 1)
#define lenr (t[rson].r - t[rson].l + 1)
#define N 1111
#define eps 1e-6
#define pi acos(-1.0)
#define e exp(1.0)
using namespace std;
const int mod = 1e9 + 7;
typedef long long ll;
typedef unsigned long long ull;
vector<int> g[maxn];
int vis[maxn], col[maxn];
tuple<int, int, int> op[maxn];
void dfs(int v, int d, int c)
{
	if (vis[v] >= d)
		return;
	vis[v] = d;
	if (!col[v])
		col[v] = c;
	if (d)
	{
		int sz = g[v].size();
		for (int i = 0; i < sz; i++)
			dfs(g[v][i], d - 1, c);
	}
}
int main()
{
	int n, m, q;
	while (~scanf("%d%d", &n, &m))
	{
		for (int i = 1; i <= n; i++)
			g[i].clear();
		fill(vis, vis + n + 1, -1);
		fill(col, col + n + 1, 0);
		while (m--)
		{
			int u, v;
			scanf("%d%d", &u, &v);
			g[u].push_back(v);
			g[v].push_back(u);
		}
		scanf("%d", &q);
		for (int i = 0; i < q; i++)
		{
			int v, d, c;
			scanf("%d%d%d", &v, &d, &c);
			op[i] = tuple<int, int, int>(v, d, c);
		}
		for (int i = q - 1; i >= 0; i--)
		{
			int v, d, c;
			tie(v, d, c) = op[i];
			dfs(v, d, c);
		}
		for (int i = 1; i <= n; i++)
			printf("%d\n", col[i]);
	}
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值