Part7.13ダイナミックプログラミング(Dynamic Programming)抽選(Floyd-Warshallアプリケーション)
質問する
!
入力
入力した最初の行には会員数があります.
ただし、会員数は50名を超えない.2行目以降、1行に2つの会員番号があり、
これは2人の会員が互いに友达であることを示している.会員番号は1から、会員数によって番号が貼ってあります.
最後の行には2つの-1があります
しゅつりょく
1行目は会長候補の点数と会長候補の数を出力し、2行目はすべての会長候補を出力する.
始まりました.
正解を解く
イニシャル化シナリオ(最初はすべて100)
幹線初期化(直ノード&対角線0)
FloydWarshallアルゴリズム
正しいコード
import sys
sys.stdin = open ("input.txt", "rt")
def input():
return sys.stdin.readline().rstrip()
if __name__ == "__main__":
#n 은 정점번호, m은 간선의 개수
n = int(input())
dis=[[100]*(n+1) for _ in range(n+1)]
for i in range(1,n+1):
dis[i][i] = 0 #대각선 0으로 초기화
while True:
a, b = map(int,input().split())
if a==-1 and b == -1:
break
dis[a][b] = 1
dis[b][a] = 1
for k in range(1,n+1): # 플로이드 워샬 알고리즘
for i in range(1, n+1):
for j in range(1, n+1):
dis[i][j] = min(dis[i][j], dis[i][k]+dis[k][j])
res=[0]*(n+1)
score = 100
for i in range(1, n+1): # 최댓값 max에 저장
for j in range(1,n+1):
res[i]= max(res[i], dis[i][j]) #i번 회원의 가까운 정도 최댓값 기록된다.
score = min(score, res[i])
out=[]
for i in range(1, n+1):
if res[i]==score:
out.append(i)
print("%d %d" %(score, len(out)))
for x in out:
print(x)
コメント
Reference
この問題について(Part7.13ダイナミックプログラミング(Dynamic Programming)抽選(Floyd-Warshallアプリケーション)), 我々は、より多くの情報をここで見つけました https://velog.io/@angel_eugnen/Part7.13동적프로그래밍DynamicProgramming회장뽑기플로이드-워샬-응용テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol