結果
問題 | No.416 旅行会社 |
ユーザー |
|
提出日時 | 2020-10-11 11:02:10 |
言語 | Lua (LuaJit 2.1.1734355927) |
結果 |
AC
|
実行時間 | 1,002 ms / 4,000 ms |
コード長 | 1,971 bytes |
コンパイル時間 | 306 ms |
コンパイル使用メモリ | 5,248 KB |
実行使用メモリ | 94,208 KB |
最終ジャッジ日時 | 2024-12-14 20:56:31 |
合計ジャッジ時間 | 10,659 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 21 |
ソースコード
local UnionFind={}UnionFind.create=function(self,n)self.par={}self.group={}for i=1,n doself.par[i]=iself.group[i]={i}endendUnionFind.getroot=function(self,x)local nx=xwhile self.par[x]~=x dox=self.par[x]endwhile self.par[nx]~=x doself.par[nx],nx=x,self.par[nx]endreturn xendUnionFind.same=function(self,x,y)return self:getroot(x)==self:getroot(y)endUnionFind.unite=function(self,x,y)local rx=self:getroot(x)local ry=self:getroot(y)if rx==ry thenreturnendif #self.group[rx]<#self.group[ry] thenrx,ry=ry,rxendfor _,v in pairs(self.group[ry]) doself.par[v]=rxtable.insert(self.group[rx],v)endself.group[ry]={}endUnionFind.new=function(self,n)local obj={}setmetatable(obj,{__index=UnionFind})obj:create(n)return objend----------local n,m,q=io.read("*n","*n","*n","*l")local map={}for i=1,m dolocal edge=io.read()local a,b=edge:match("(%d+) (%d+)")map[edge]={tonumber(a),tonumber(b)}endlocal event={}local bridge={}for i=1,q dolocal edge=io.read()local c,d=edge:match("(%d+) (%d+)")event[edge]=truebridge[i]={tonumber(c),tonumber(d)}endlocal uf=UnionFind:new(n)for edge,vertex in pairs(map) doif not event[edge] thenlocal a,b=vertex[1],vertex[2]uf:unite(a,b)endendlocal result={}local root=uf.par[1]for _,vertex in pairs(uf.group[root]) doresult[vertex]=-1endfor i=q,1,-1 dolocal c,d=bridge[i][1],bridge[i][2]if uf:same(c,d) thengoto continueendif uf:same(1,c) or uf:same(1,d) thenif uf:same(1,d) thenc,d=d,cendlocal root=uf.par[d]for _,vertex in pairs(uf.group[root]) doresult[vertex]=iendenduf:unite(c,d)::continue::endfor i=2,n doprint(result[i] or 0)end