def strong_components(graph):
if type(graph) is not list or len(graph) > 64:
raise ValueError("scc.graph")
n = len(graph)
if any(type(row) is not set or any(type(v) is not int or not 0 <= v < n for v in row) for row in graph):
raise ValueError("scc.edge")
seen, order = set(), []
for start in range(n):
if start in seen:
continue
seen.add(start)
stack = [(start, iter(sorted(graph[start])))]
while stack:
node, edges = stack[-1]
target = next(edges, None)
if target is None:
order.append(node)
stack.pop()
elif target not in seen:
seen.add(target)
stack.append((target, iter(sorted(graph[target]))))
reverse = [set() for _ in graph]
for node, edges in enumerate(graph):
for target in edges:
reverse[target].add(node)
seen, result = set(), []
for start in reversed(order):
if start in seen:
continue
group, pending = [], [start]
seen.add(start)
while pending:
node = pending.pop()
group.append(node)
for target in reverse[node]-seen:
seen.add(target)
pending.append(target)
result.append(sorted(group))
return sorted(result)
適用前に確認
実際の動作を期待する結果と比較します。検証に失敗した場合は、次の変更を加える前に原因を調べてください。
モデル
OpenAI互換またはAnthropicのエンドポイントを、ベースURLと必要なAPIキーで設定し、接続をテストします。ローカルのモデルサーバーは起動が必要です。リモートツールは別途データを送信する場合があります。
プロジェクト
閉路、孤立頂点、空の入力を試し、隣接集合を変更せずに不正な集合要素を拒否します。
def strong_components(graph):
if type(graph) is not list or len(graph) > 64:
raise ValueError("scc.graph")
n = len(graph)
if any(type(row) is not set or any(type(v) is not int or not 0 <= v < n for v in row) for row in graph):
raise ValueError("scc.edge")
seen, order = set(), []
for start in range(n):
if start in seen:
continue
seen.add(start)
stack = [(start, iter(sorted(graph[start])))]
while stack:
node, edges = stack[-1]
target = next(edges, None)
if target is None:
order.append(node)
stack.pop()
elif target not in seen:
seen.add(target)
stack.append((target, iter(sorted(graph[target]))))
reverse = [set() for _ in graph]
for node, edges in enumerate(graph):
for target in edges:
reverse[target].add(node)
seen, result = set(), []
for start in reversed(order):
if start in seen:
continue
group, pending = [], [start]
seen.add(start)
while pending:
node = pending.pop()
group.append(node)
for target in reverse[node]-seen:
seen.add(target)
pending.append(target)
result.append(sorted(group))
return sorted(result)
依存グループにアプリケーションで使える意味を与える
ComponentWispは、プロジェクトのデータとコードを通じて関係を追う開発者向けのWindows AIコーディング環境です。グラフ表現とグループを必要とする利用側を会話に提示してください。グループ分けの変更を提案する前に、有向辺の意味をアシスタントに調べてもらいます。保持する関係がアプリケーションの答えたい問いと一致して初めて、結果が役立ちます。
strong_components.pyの作業では、有向経路で頂点同士が互いに到達できるグループを調べられます。小さな依存関係の例で相互到達と一方向の接続を区別し、実装と出力順序をレビューしてください。依存関係に適用するなら実際のオブジェクトと頂点の対応を明示します。補助関数だけでは依存関係の意味は定まりません。
提案を読んだら、循環、一方向リンク、孤立頂点でプロジェクトの検証を実行し、利用側がグループを一貫して扱うか確認します。ComponentWispは対応するOpenAI互換またはAnthropicのエンドポイントに接続し、必要なら認証情報を使います。提供されれば制限のないモデルを選べますが、制限、ツール、コンテキスト上限はモデルとサーバーが決めます。以後の編集も同じ要件を保つよう、辺の意味と期待するグループを会話に残してください。
依存関係のグループ分けコードに関する質問
一方向の依存だけで同じグループにできますか?
相互の有向到達可能性で定義するグループではできません。有向の関係を誤って無向の接続として扱わないよう、意図する規則を示し、一方向の例を含めてください。
実際のプロジェクトのオブジェクトを頂点へどう対応させますか?
利用側が結果を解釈できる明示的な対応表を保ちます。オブジェクトを削除したり並べ替えたりした場合を調べ、返されたグループが引き続き意図したオブジェクトを指すかテストしてください。
依存関係をグループ化すれば実行順序も決まりますか?
それは別の問いです。グループの順序付けや循環処理には追加ロジックが必要な場合があります。分割が完全な実行計画だと思い込まず、その要件を別途特定し、関係する利用側を調べてください。
孤立頂点も検証に含める理由は?
辺のないオブジェクトにも期待する表現が与えられるか確認するためです。特に既存の接続だけを反復して中間構造を作る変更では、補助関数の出力と利用側の表示の両方を確認してください。
ComponentWisp · 更新日 2026-10-25