http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=388&sca=3070
파이썬이라 그런지 알고리즘이 문젠지 처음에는 시간초과가 나왔었다. 시간초과임에도 60점을
주는거보니 답은 맞았다 싶어서 시간초과를 없애는데 주력했다.
처음에는 그냥 말그대로 반복문을 다 돌면서 '하나하나' BFS로 거리를 구했는데 시간초과가 떴다.
곰곰히 생각하다가 BFS안에서 답이 나올때마다 저장해주자는 식으로 코드를 작성했고,
BFS가 끝난 후 반복문을 다시 돌때 이미 답이 있으면 그냥 무시하고 도는 식으로 코드를 짰다.
시간이 3800ms정도 걸리던게 940정도로 확 줄면서 통과했다.
# -*- encoding: cp949 -*- import Queue answer = [[0 for j in xrange(501)] for i in xrange(501)] def bfs(graph,v,arr,visted): global num global answer q = Queue.Queue() q.put(v) while not q.empty(): for k in xrange(q.qsize()): p = q.get() if v!=p and answer[v][p]==0 and p in xrange(1,max+1): #이거때문에 시간초과가 없어졌다. answer[v][p] = num if visited[p]==0: visited[p] = 1 for i in xrange(len(graph)): if graph[p][i] == 1 and visited[i]==0: q.put(i) num += 1 n = int(raw_input()) graph = [[0 for j in xrange(501)] for i in xrange(501)] max = 0 for i in xrange(n): x,y = map(int,raw_input().split()) max = x if x > max else y if y > max else max graph[x][y] = 1 for i in xrange(1,max+1): for j in xrange(1,max+1): if i!=j: num = 0 visited = [0 for k in xrange(501)] if answer[i][j]==0: bfs(graph,i,j,visited) print round(sum(map(lambda x:sum(x),answer))/float(max*(max-1)),3)
https://www.acmicpc.net/problem/1987
분명히 알고리즘은 맞는거같은데 파이썬이라 그런지 모르겠는데 시간초과가 떠버린다.
추가. c++로 짰더니 제대로 동작한다.
'algorithm > problem solving' 카테고리의 다른 글
acmicpc.net 4963(백트래킹), 1759(BFS?;;) (0) | 2016.08.07 |
---|---|
acmicpc.net 1920(정렬), 1620(정렬), 1764(정렬), 1181(정렬) (0) | 2016.08.02 |
acmicpc.net 2638(BFS), acmicpc.net 2636(BFS) (0) | 2016.07.29 |
acmicpc.net 1260(DFS, BFS), 2178(BFS) (0) | 2016.07.28 |
정올 1457(백트래킹), 1824(백트래킹) (0) | 2016.07.21 |