結果
| 問題 |
No.3201 Corporate Synergy
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-07-11 21:54:36 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 96 ms / 2,000 ms |
| コード長 | 6,769 bytes |
| コンパイル時間 | 215 ms |
| コンパイル使用メモリ | 82,596 KB |
| 実行使用メモリ | 77,916 KB |
| 最終ジャッジ日時 | 2025-07-11 21:54:43 |
| 合計ジャッジ時間 | 2,350 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 20 |
ソースコード
# input
import sys
input = sys.stdin.readline
II = lambda : int(input())
MI = lambda : map(int, input().split())
LI = lambda : [int(a) for a in input().split()]
SI = lambda : input().rstrip()
LLI = lambda n : [[int(a) for a in input().split()] for _ in range(n)]
LSI = lambda n : [input().rstrip() for _ in range(n)]
MI_1 = lambda : map(lambda x:int(x)-1, input().split())
LI_1 = lambda : [int(a)-1 for a in input().split()]
def graph(n:int, m:int, dir:bool=False, index:int=-1) -> list[set[int]]:
edge = [set() for i in range(n+1+index)]
for _ in range(m):
a,b = map(int, input().split())
a += index
b += index
edge[a].add(b)
if not dir:
edge[b].add(a)
return edge
def graph_w(n:int, m:int, dir:bool=False, index:int=-1) -> list[set[tuple]]:
edge = [set() for i in range(n+1+index)]
for _ in range(m):
a,b,c = map(int, input().split())
a += index
b += index
edge[a].add((b,c))
if not dir:
edge[b].add((a,c))
return edge
mod = 998244353
inf = 1001001001001001001
ordalp = lambda s : ord(s)-65 if s.isupper() else ord(s)-97
ordallalp = lambda s : ord(s)-39 if s.isupper() else ord(s)-97
yes = lambda : print("Yes")
no = lambda : print("No")
yn = lambda flag : print("Yes" if flag else "No")
def acc(a:list[int]):
sa = [0]*(len(a)+1)
for i in range(len(a)):
sa[i+1] = a[i] + sa[i]
return sa
prinf = lambda ans : print(ans if ans < 1000001001001001001 else -1)
alplow = "abcdefghijklmnopqrstuvwxyz"
alpup = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
alpall = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
URDL = {'U':(-1,0), 'R':(0,1), 'D':(1,0), 'L':(0,-1)}
DIR_4 = [[-1,0],[0,1],[1,0],[0,-1]]
DIR_8 = [[-1,0],[-1,1],[0,1],[1,1],[1,0],[1,-1],[0,-1],[-1,-1]]
DIR_BISHOP = [[-1,1],[1,1],[1,-1],[-1,-1]]
prime60 = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59]
sys.set_int_max_str_digits(0)
# sys.setrecursionlimit(10**6)
# import pypyjit
# pypyjit.set_param('max_unroll_recursion=-1')
from collections import defaultdict,deque
from heapq import heappop,heappush
from bisect import bisect_left,bisect_right
DD = defaultdict
BSL = bisect_left
BSR = bisect_right
from collections import deque
class mf_graph:
n=0
g=[]
def __init__(self,n_):
self.n=n_
self.g=[[] for i in range(self.n)]
self.pos=[]
class _edge:
to=0
rev=0
cap=0
def __init__(self,to_,rev_,cap_):
self.to=to_
self.rev=rev_
self.cap=cap_
class edge:
From=0
To=0
Cap=0
Flow=0
def __init__(self,from_,to_,cap_,flow_):
self.From=from_
self.To=to_
self.Cap=cap_
self.Flow=flow_
def add_edge(self,From_,To_,Cap_):
assert 0<=From_ and From_<self.n
assert 0<=To_ and To_<self.n
assert 0<=Cap_
m=len(self.pos)
self.pos.append((From_,len(self.g[From_])))
from_id=len(self.g[From_])
to_id=len(self.g[To_])
if (From_==To_):to_id+=1
self.g[From_].append(self._edge(To_,to_id,Cap_))
self.g[To_].append(self._edge(From_,from_id,0))
return m
def get_edge(self,i):
m=len(self.pos)
assert 0<=i and i<m
_e=self.g[self.pos[i][0]][self.pos[i][1]]
_re=self.g[_e.to][_e.rev]
return self.edge(self.pos[i][0],_e.to,_e.cap+_re.cap,_re.cap)
def edges(self,isdict=True):
m=len(self.pos)
result=[]
for i in range(m):
if isdict:
e=self.get_edge(i)
result.append({"from":e.From,"to":e.To,"cap":e.Cap,"flow":e.Flow})
else:
result.append(self.get_edge(i))
return result
def change_edge(self,i,new_cap,new_flow):
m=len(self.pos)
assert 0<=i and i<m
assert 0<=new_flow and new_flow<=new_cap
_e=self.g[pos[i][0]][pos[i][1]]
_re=self.g[_e.to][_e.rev]
_e.cap=new_cap-new_flow
_re.cap=new_flow
assert id(_e)==id(self.g[self.pos[i][0]][self.pos[i][1]])
assert id(_re)==id(self.g[_e.to][_e.rev])
def flow(self,s,t,flow_limit=(1<<63)-1):
assert 0<=s and s<self.n
assert 0<=t and t<self.n
assert s!=t
level=[0 for i in range(self.n)]
Iter=[0 for i in range(self.n)]
que=deque([])
def bfs():
for i in range(self.n):
level[i]=-1
level[s]=0
que.clear()
que.append(s)
while(que):
v=que.popleft()
for e in self.g[v]:
if e.cap==0 or level[e.to]>=0:
continue
level[e.to]=level[v]+1
if (e.to==t):
return
que.append(e.to)
def dfs(v,up):
if v==s:return up
res=0
level_v=level[v]
for i in range(Iter[v],len(self.g[v])):
e=self.g[v][i]
assert id(e)==id(self.g[v][i])
if level_v<=level[e.to] or self.g[e.to][e.rev].cap==0:
continue
d=dfs(e.to,min(up-res,self.g[e.to][e.rev].cap))
if d<=0:continue
self.g[v][i].cap+=d
self.g[e.to][e.rev].cap-=d
res+=d
if (res==up):
return res
level[v]=self.n
return res
flow=0
while(flow<flow_limit):
bfs()
if level[t]==-1:
break
Iter=[0 for i in range(self.n)]
f=dfs(t,flow_limit-flow)
if not(f):
break
flow+=f
return flow
def min_cut(self,s):
visited=[False for i in range(self.n)]
que=deque([s])
while(que):
p=que.popleft()
visited[p]=True
for e in self.g[p]:
if e.cap and not(visited[e.to]):
visited[e.to]=True
que.append(e.to)
return visited
n = II()
p = LI() # 利益
g = mf_graph(1 + n + 200 + 1)
s = n
t = n + 1
off = n + 2
ans = 0
for i in range(n):
if p[i] > 0:
g.add_edge(s, i, p[i])
g.add_edge(i, t, 0)
ans += p[i]
elif p[i] < 0:
g.add_edge(s, i, 0)
g.add_edge(i, t, -p[i])
m = II()
for i in range(m):
u, v = MI_1()
g.add_edge(v, u, inf)
k = II()
for i in range(k):
a, b, q = MI()
a -= 1
b -= 1
g.add_edge(s, off + i, q)
g.add_edge(off + i, a, inf)
g.add_edge(off + i, b, inf)
ans += q
flow = g.flow(s, t)
print(ans - flow)