質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1971閲覧

グラフ中の長さ3と長さ4の閉路を検出したい

hello_whats_up

総合スコア57

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/02/03 10:35

編集2019/02/03 10:36

グラフ中に含まれる長さが3と4の閉路を求めるアルゴリズムを考えています。
なにか良いアイデアはないでしょうか?
(グラフの情報は外部からストリームして、C言語で開発しています。)

ただし、以下のような場合は長さ3の閉路が2つで4の閉路があるとはカウントしません。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wwbQzhMkhhgEmhU

2019/02/03 14:00

ルールが明確じゃないですよ。 ストリームとやらの法則だって重要です。 また、まずは自分で組んでから聞きましょう。
guest

回答1

0

ベストアンサー

アイデアということなので。

長さが3の閉路は、スタートのノードと結ばれる2つのノードを必ず含みます。(質問の図でいうと、スタートをiとすると、[v1,v2],[v1,j],[v2,j]のいずれかが候補になる)また、この候補の組み合わせのノード間には必ずエッジがあります。(長さ3のうち、2つのノードで長さ2が消費されるため)
よって、上記の条件を実装すれば長さ3の閉路の検出ができることになります。もう少し具体的にいうと

1.ノード間のエッジの有無を0と1で表現した行列(Xとする)を準備する。(縦軸をi,v1,v2,j、横軸をi,v1,v2,jとして交差する部分にエッジがあれば1、なければ0を設定)
2.Xの行数分、以下の処理を実施
1)特定の行を取り出して1が設定されているインデックスを検出(x[0,:]であれば、[0,1,1,1]
なので、[1,2,3]となる。
2)上記の[1,2,3]から2つを取り出した組み合わせを生成([1,2],[1,3],[2,3]となる)
3)Xから上記の組み合わせの要素を取り出して1であれば長さ3の閉路と判定
3.重複ケースをチェックして除外

というコードでうまくいくはずです。

長さ4の閉路もおおよそは上記のルールの応用でうまくいくはずです。スタートのノードと結ばれるノード2つが候補というところまでは同じです。長さ4の場合は、この候補各々と結ばれるノードを検出してこのノードの集合の積を取った結果、残ったノードがあれば長さ4のノードということになります。
上記もエッジの有無を表す行列を使えば、それほど難しくないはずです。

最後の「以下のような場合は長さ3の閉路が2つで4の閉路があるとはカウントしません。」については以前に回答した記憶があるので確認願います。

細かなケースは検証していないので、実装して問題の有無を確認願います。

投稿2019/02/04 10:57

R.Shigemori

総合スコア3376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問