algorithm/problem solving

정올 1108(BFS), acmicpc 1987(DFS,c++)

qkqhxla1 2016. 7. 30. 15:59

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++로 짰더니 제대로 동작한다.