试题J:郊外植树
样例
输入
6
1 1 2
1 4 2
1 7 2
4 1 2
4 4 2
4 7 2
输出
12
分析
把每棵树抽象成一个节点,我是先判断任意两颗树能不能种在一起(就是判断是否相离或相切),如果可以的话就连一条无向边,然后判断这个图中所有的完全子图中对应植树面积最大的那个。注意要判断下是不是存在只种一棵树面积最大的情况。
n=input()
n=int(n)
xx=[[0]for i in range(n)]
yy=[[0]for i in range(n)]
rr=[[0]for i in range(n)]
g=[[[0]for i in range(n)]for j in range(n)]
##
trace=[]
vis=[]
area=[[0]for i in range(n)]
##
key=[]
ans=0
def jud(x1,y1,r1,x2,y2,r2):
dis=(y2-y1)**2+(x2-x1)**2
sumR=(r1+r2)**2
if dis>=sumR:
return True
return False
def check(road):
for i in range(len(road)):
for j in range(i+1,len(road)):
if g[road[i]][road[j]]==[0]:
return False
return True
def dfs(num):
global ans
global key
if(num in vis):
if(num in trace):
trace_index=trace.index(num)
for i in range(trace_index,len(trace)):
key.append(trace[i])
if(check(key)):
tmp=0
for i in key:
tmp+=area[i]
ans=max(tmp,ans)
key=[]
return
return
vis.append(num)
trace.append(num)
for i in range(n):
if(g[num][i]==1):
dfs(i)
trace.pop()
maxr=0
for i in range(n):
x,y,r=input().split()
x=int(x)
y=int(y)
r=int(r)
xx[i]=x
yy[i]=y
rr[i]=r
maxr=max(r,maxr)
area[i]=r**2
for i in range(n):
for j in range(i+1,n):
if jud(xx[i],yy[i],rr[i],xx[j],yy[j],rr[j]):
g[i][j]=1
g[j][i]=1
for i in range(n):
dfs(i)
if ans==0:
print(maxr**2)
else:
print(max(ans,maxr**2))