defproc(graph):
visited = []
buf = []
cnt = 0definbound(x,y):return x<m and y<n and x>-1and y>-1definit(m,n):nonlocal visited,buf,cnt
cnt = 0
visited,buf = [[None]*n for i in range(m)],[[-1]*n for i in range(m)]
m,n,flag = 1,8,False
init(m,n)
deffloodfill(x,y,k):nonlocal cnt,buf,visited,graph,flag
if visited[x][y]!=Noneor graph[x][y]!='@':return
visited[x][y] = 1if buf[x][y] ==-1:buf[x][y] = k;flag = Trueelse:returnfor i in range(-1,2):
for j in range(-1,2):
u,v = x+i,y+j
if inbound(u,v):floodfill(u,v,k)
pq = []
for i,each in enumerate(graph):
for j,node in enumerate(each):
if node=='@':pq.append((i,j))
for k,item in enumerate(pq):
floodfill(item[0],item[1],k)
if flag==True:cnt+=1
flag = False
print(cnt)
proc([list('@@**@*@*')])
To = {'0':'0000','1':'0001','2':'0010','3':'0011','4':'0100','5':'0101','6':'0110','7':'0111',\
'8':'1000','9':'1001','a':'1010','b':'1011','c':'1100','d':'1101','e':'1110','f':'1111'}
From = {1:'A',3:'J',5:'D',4:'S',0:'W',2:'K'}
defproc():definbound(x,y):nonlocal h,w
return x>-1and y>-1and x<h and y<w*4defwhite_search(x,y):nonlocal graph,visited
if visited[x][y]==1or graph[x][y]=='1':return
visited[x][y]=1for i in range(-1,2):
for j in range(-1,2):
if i*j==0and inbound(x+i,y+j):white_search(x+i,y+j)
defblack_search(x,y):nonlocal white_cnt,graph,visited
if visited[x][y]==1:returnif graph[x][y]=='0':
white_cnt+=1
white_search(x,y)
returnelse:visited[x][y]=1for i in range(-1,2):
for j in range(-1,2):
if i*j==0and inbound(x+i,y+j):black_search(x+i,y+j)
deffirst(graph):return [0,0]
line = input()
line = line.split(' ')
h,w = int(line[0]),int(line[1])
count = h
visited = [[0]*w*4for i in range(h)]
graph = []
while count:
count-=1
line = input()
codes = reduce(lambda x,y:x+y,[To[ch] for ch in line],'')
graph.append(codes)
black_cnt = 0
white_search(*first(graph))
for i in range(len(graph)):
for j in range(len(line)):
if visited[i][j]==0and graph[i][j]=='1':
white_cnt = 0
black_cnt+=1;black_search(i,j)
print(From[white_cnt])
proc()
final_state = None
go = {0:(-1,0),1:(0,-1),2:(1,0),3:(0,1)}
D = {'L':1,'R':-1,'F':0}
defBFS(q,goal,states,maze):global final_state,go
while len(q):
x,y,r = q.popleft()
if (x,y) == goal:final_state = (x,y,r);break
rule = maze[x][y]
possible_ways = analyze(r,rule)
for next_way in possible_ways:
i,j = go[next_way]#according to turn,determine the next direction
next_state = (x+i,y+j,next_way)
if next_state notin states:
states[next_state] = (x,y,r)
q.append(next_state)
defanalyze(r,rule):global D
t = {0:'N',1:'W',2:'S',3:'E'}
u = {'N':0,'W':1,'S':2,'E':3}
a = [[(r+D[d])%4for d in each[1:]]for each in rule if u[each[0]]==r]
return a[0] if a!=[] else []
defprocess_data(data):
ans = []
data = data.split(' ')
x,y = int(data[0]),int(data[1])
for rule in data[2:-1]:
ans.append(rule)
return x,y,ans
deftrack(final_state,states):if final_state in states:
p = states[final_state]
track(p,states)
print(final_state,end='->')
defproc():global go
t = {'N':0,'W':1,'S':2,'E':3}
states = {}
while1:
name = input()
if name=='END':break
maze = [[[] for j in range(9)] for i in range(9)]
f = input()
f = f.split(' ')
w,goal = (int(f[0]),int(f[1]),t[f[2]]),(int(f[3]),int(f[4]))
i,j= go[w[2]]
initial = (w[0]+i,w[1]+j,w[2])
print(states)
while1:
data = input()
if data=='0':break
x,y,rule = process_data(data)
maze[x][y] = rule
q = deque()
q.append(initial)
states = {}
final_state = None
states[initial] = w
BFS(q,goal,states,maze)
track(final_state,states)
proc()
deftopsort(graph_dic,n):
Indegree = [0]*(n+1)
sort_ans = []
box = []
for key,v in graph_dic.items():
for vertex in v:Indegree[vertex]+=1for i,each in enumerate(Indegree[1:]):
if each==0:box.append(i+1)
while len(box):
first = box.pop()
sort_ans.append(first)
if first notin graph_dic:continuefor adj_v in graph_dic[first]:
Indegree[adj_v]-=1if Indegree[adj_v]==0:
box.append(adj_v)
assert(len(sort_ans)==n)
return sort_ans
defproc():defget_2():
first_line = input()
first_line = first_line.split(' ')
return int(first_line[0]),int(first_line[1])
while1:
n,m = get_2()
ifnot m|n:break
t = m
graph_dic = {}
while t:
a,b = get_2()
if a in graph_dic:graph_dic[a].append(b)
else:graph_dic[a]=[b]
t-=1
print(topsort(graph_dic,n))
defdfs(graph_dic,visited,sort_ans,u):
visited[u] = -1for v in (graph_dic[u] if u in graph_dic else []):
print(u,v,visited)
if visited[v]<0:print('aaaaaa',u,v,visited);returnFalseelifnot visited[v] andnot dfs(graph_dic,visited,sort_ans,v):returnFalse
visited[u] = 1
sort_ans.appendleft(u)
returnTruedefprocdfs():defget_2():
first_line = input()
first_line = first_line.split(' ')
return int(first_line[0]),int(first_line[1])
while1:
n,m = get_2()
ifnot m|n:break
t = m
graph_dic = {}
while t:
a,b = get_2()
if a in graph_dic:graph_dic[a].append(b)
else:graph_dic[a]=[b]
t-=1
sort_ans,visited = deque(),[0]*(n+1)
for u in range(1,n+1):
ifnot visited[u]:dfs(graph_dic,visited,sort_ans,u)
print(sort_ans)
procdfs()
deftopsort(graph_dic,sort_ans,Indegree,box,all_result,n):if len(sort_ans)==n:all_result.append(sort_ans);returnfor first in box:
next_sort_ans,next_Indegree,next_box = sort_ans[::],Indegree[::],box[::]
next_box.remove(first)
next_sort_ans.append(first)
#update the adj vertexif first in graph_dic:
for adj_v in graph_dic[first]:
next_Indegree[adj_v]-=1if next_Indegree[adj_v]==0:
next_box.append(adj_v)
topsort(graph_dic,next_sort_ans,next_Indegree,next_box,all_result,n)
defproc():defget_2():
first_line = input()
first_line = first_line.split(' ')
return int(first_line[0]),int(first_line[1])
while1:
n,m = get_2()
ifnot m|n:break
t = m
graph_dic = {}
while t:
a,b = get_2()
if a in graph_dic:graph_dic[a].append(b)
else:graph_dic[a]=[b]
t-=1
Indegree,box,all_res = [0]*(n+1),[],[]
for key,v in graph_dic.items():
for vertex in v:Indegree[vertex]+=1for i,each in enumerate(Indegree[1:]):
if each==0:box.append(i+1)
topsort(graph_dic,[],Indegree,box,all_res,n)
print(all_res)
proc()
6−16:
首先给出一个我自己写的,可以找出欧拉回路的程序:
代码比较多,基本思路是判断连通(构造有向图,有向图-〉无向图->dfs判断连通,统计度数)
defis_con(g,vertexs):
ind = {}
for v in vertexs:ind[v] = 0for u in g:
for v in g[u]:ind[v]+=1;ind[u]+=1
t = [0for v in vertexs if ind[v]==0]
return len(t)==0defdouble_graph(g):
base_graph = g.copy()
for each in g:
for v in base_graph[each]:
if v in base_graph:
if each notin base_graph[v]:base_graph[v].append(each)
else:
base_graph[v] = [each]
return base_graph
defeuler_circle(graph,base_graph,vertexs):defselect(vertexs):nonlocal graph,first
ind = {};outd = {}
for v in vertexs:ind[v] = 0;outd[v]=0for vertex in graph:
for each in graph[vertex]:
outd[vertex]+=1
ind[each[0]]+=1
t = [(v,ind[v]-outd[v]) for v in vertexs if ind[v]-outd[v]!=0]
if len(t)==0:returnTrueelif len(t)!=2:returnFalseelse:
a,b = t[0],t[1]
if a[1]*b[1]!=-1:returnFalse
first = a if a[1]==-1else b
returnTruedefeuler(u):nonlocal graph,vis
for e in graph[u] if u in graph else []:
if e notin vis:
vis.add(e)
euler(e[0])
print(edges[e[1]])
vis = set()
first = Noneif select(vertexs) and is_con(double_graph(base_graph),vertexs):
euler(first[0])
else:print('No')
edges = {}
defproc():global edges
T = int(input())
m = int(input())
graph,vs = {},set()
base_graph = {}
cnt = 0while m:
word = input()
m-=1;cnt+=1
edges[cnt] = word
vs.add(word[0]);vs.add(word[-1])
if word[0] in graph:
graph[word[0]].append((word[-1],cnt))
if word[-1] notin base_graph[word[0]]:base_graph[word[0]].append(word[-1])
else:
graph[word[0]] = [(word[-1],cnt)]
base_graph[word[0]] = [word[-1]]
print(edges)
euler_circle(graph,base_graph,vs)
proc()
edges = {}
pa = list(range(256))
deffindset(x):return x if pa[x]==x else findset(pa[x])
defproc():global edges
T = int(input())
m = int(input())
graph,vs,deg = {},set(),[0]*27
cnt,con = 0,0while m:
word = input()
m-=1;cnt+=1
edges[cnt] = word
c1,c2 = ord(word[0])-ord('a'),ord(word[-1])-ord('a')
vs.add(c1);vs.add(c2)
if c1 in graph:graph[c1].append((c2,cnt))
else:graph[c1] = [(c2,cnt)]
s1,s2 = findset(c1),findset(c2)
if s1!=s2:pa[s1] = s2;con+=1
deg[c1]-=1;deg[c2]+=1
con = len(vs)-con;
t = [i for i in deg if i!=0]
if con==1and (len(t)==0or (len(t)==2and t[0]*t[1]==-1)):
first = deg.index(-1)
euler_circle(graph,vs,first)
else:print('No Possible road')
defeuler_circle(graph,vertexs,u):defeuler(u):nonlocal graph,vis
for e in graph[u] if u in graph else []:
if e notin vis:
vis.add(e)
euler(e[0])
print(edges[e[1]])
vis = set()
first = None
euler(u)
proc()