C - Tour
問題:https://atcoder.jp/contests/ABC204/tasks/abc204_c
答え(python)(動作確認用のprint有り):kobashun5848.icon
・解説コードの途中にprint文入れて、何してるか分かりやすいようにしたもの
・解説コードの動作が分からない人はこのコード実行したらわかりやすいかも
code:python
import sys
# pythonの最大再帰数の初期設定値1000になっている。設定を変更しない場合、大きい入力値でエラーになってしまう。
sys.setrecursionlimit(10000)
# 入力の読み込み
N,M=map(int,input().split())
G=[[] for i in range(N)]
# Gi は都市iから道路で直接繋がっている都市のリスト
for i in range(M):
A,B=map(int,input().split())
GA-1.append(B-1)
print("G:",G)
# dfs
def dfs(v):
print("dfs",v,"")
if tempv:
print("同じ頂点を2度以上調べないためにreturn")
return # 同じ頂点を2度以上調べないためのreturn
print("temp",v,"をTrueに変換")
tempv=True
print(temp)
for vv in Gv: # ここが深さ優先探索になる由縁
dfs(vv)
ans=0
# 都市iからスタートする場合
for i in range(N):
print("-------",i+1,"番目の都市からいける都市を計算------------------------")
temp=False*N
# tempj は都市jに到達可能かどうかを表す
dfs(i)
ans += sum(temp)
print("ans:",ans)
print(ans)
swiftも書いたよ 👏🏼
code:swift
func readtaple() -> (A:Int, B:Int){
let ints = readLine()!.split(separator: " ").map{Int($0)!}
return (A:ints0, B:ints1)
}
//NとMの読み込み
let n = readLine()!.split(separator: " ").map{Int($0)!}
let N = n0 //都市数
let M = n1 //道の数
if M != 0{ //M=0の時はエラーが出るのでその対処
//道の読み込みとリストの作成
//空のリスト作成
var G = Int()
for _ in 1...N{
G.append([])
}
//入力に対して処理
for _ in 1...M{
let tpl = readtaple()
Gtpl.0 - 1.append(tpl.1 - 1)
}
var temp = Bool()
//dfsの実装
func dfs(v:Int){
if tempv{return}
tempv = true
for vv in Gv{
dfs(v: vv)
}
}
var ans:Int = 0
//都市iからスタートする場合
for i in 0...N-1{
temp = []
for _ in 0...N-1{
temp.append(false)
}
dfs(v: i)
ans = ans + temp.filter{ $0 == true}.count
}
print(ans)
}else{
print(N)
}
#AtCoder_Beginner_Contest_204
#C
#小橋_解いた問題
#幅優先探索