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
- 1≤N,M,Q≤105
- 1≤ai,bi,vi≤N
- ai≠bi
- 0≤di≤10
- 1≤ci≤105
- 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 1≤N,M,Q≤2,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
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
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 1, 2, 3, 4 and 5 are repainted in color 2.
![2ab7e180230b159d42d35ea7e555b3b0.png](https://i-blog.csdnimg.cn/blog_migrate/dafab04e150d902c1958cc4fca618111.png)
Sample Input 2
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
1 0 3 1 5 5 3 3 6 1 3 4 5 3
The given graph may not be connected.
给一个包含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;
}