http://agc012.contest.atcoder.jp/submissions/1414860
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.
自行翻译
大致是有n个点m条边 q个操作
每个操作是将点u及到它距离在d以内的点染上c
我们可以从后向前找 这样就不会重复染色
另外我们可以对每个点向外的范围进行记录,扫描时如果剩下的范围小于点上标记的范围
就不要扫下去了
(manacher??)
var i,j,k,l,m,n,q,w,x,y,t:longint;
st,ed,first,next,d,v,color,fw,c:array[1..200000] of longint;
b:array[1..200000]of boolean;
procedure ad(p,o:longint);
begin
t:=t+1; ed[t]:=o; next[t]:=first[p];first[p]:=t;
end;
procedure dfs(p,o,cl:longint);
var i,j:longint;
begin
if fw[p]>=o then exit;
i:=first[p]; fw[p]:=o; b[p]:=true;
if color[p]=0 then color[p]:=cl;
while (i>=1) do begin
if b[ed[i]]=false then
dfs(ed[i],o-1,cl);
i:=next[i];
end;
b[p]:=false;
end;
begin
readln(n,m);
for i:=1 to m do first[i]:=-1;
fillchar(fw,sizeof(fw),255);
for i:=1 to m do begin readln(x,y); ad(x,y);ad(y,x); end;
readln(q);
for i:=1 to q do readln(v[i],d[i],c[i]);
for i:=q downto 1 do begin dfs(v[i],d[i],c[i]); end;
for i:=1 to n do writeln(color[i]);
end.
、
本文介绍了一种解决图染色问题的方法,通过反向操作避免重复染色,并使用标记记录节点染色范围来提高效率。
7827

被折叠的 条评论
为什么被折叠?



