グラフを縮小させたい
Posted: 2008年12月27日(土) 18:54
学校の課題で、ある重み付きグラフ(頂点と辺がある方です)の縮小グラフの作り方を考えています。
重みというのは、辺の長さみたいなものです。
具体的に言うと、まず、元のグラフの情報として、
#define N 6
#define M 9999
G[N+1][N+1]={{0,0,0,0,0,0,0},
{0,0,4,M,3,M,2},
{0,4,0,3,M,2,M},
{0,M,3,0,2,M,4},
{0,3,M,2,0,4,M},
{0,M,2,M,4,0,3},
{0,2,M,4,M,3,0}};
を与えます。これはN=6頂点のグラフの隣接行列という情報です。
例えばG[2][1]が4というのは頂点②と頂点①の間に重み4の辺があるよ、という意味です。
G[3][1]がMというのは③と①の間は無限距離=辺が無い、という意味です。
同じ頂点同士に辺は置けないので、0としています。
なので、必然的にG[A]とG[A]は同じ要素になります。
このとき、このグラフの頂点たちをグループ分けして、そのグループをひとつの頂点として考えて、
新たにその頂点同士のグラフを作る、ということ考えています。
例えば、Group1(G1)を頂点①②、G2を頂点③④、G3を頂点⑤⑥というふうに3グループに分割します。
グループ分けした後、どのようにそのグループ同士を辺で繋ぐかというと、グループ間の中にある辺の中
で重みが一番小さいものを1本採択します。辺が1本も無ければ、グループ間の辺ももちろん作りません。
G1とG2を例にすると、まず元のグラフのG[1][2]とG[1][3]とG[2][3]とG[2][4]の要素を取り出して、
その中で一番小さい要素を、G1とG2の間にある辺の情報とします。
これを同様にG2とG3、G3とG1に対しても行います。
そして、新たなG1G2G3に対する以下の隣接行列G'を得ます。
G'[3+1][3+1]={{0,0,0,0},
{0,0,3,2},
{0,3,0,4},
{0,2,4,0}};
ここまでが作りたいプログラムの概要です。
このような規模の小さいグラフで、分割の情報も単純であれば、私でもプログラムすることはできるのですが、
できたらどんな頂点数でもどんな分割の仕方でも対応できる汎用性のあるプログラムにしたいのです。
一番悩んでいるのは、どのように頂点の分割を入力情報として与えたら良いのかというところです。
ややこしい話ですみませんが、よろしくお願いします。
ちなみに環境はVista/VisualC++です。
重みというのは、辺の長さみたいなものです。
具体的に言うと、まず、元のグラフの情報として、
#define N 6
#define M 9999
G[N+1][N+1]={{0,0,0,0,0,0,0},
{0,0,4,M,3,M,2},
{0,4,0,3,M,2,M},
{0,M,3,0,2,M,4},
{0,3,M,2,0,4,M},
{0,M,2,M,4,0,3},
{0,2,M,4,M,3,0}};
を与えます。これはN=6頂点のグラフの隣接行列という情報です。
例えばG[2][1]が4というのは頂点②と頂点①の間に重み4の辺があるよ、という意味です。
G[3][1]がMというのは③と①の間は無限距離=辺が無い、という意味です。
同じ頂点同士に辺は置けないので、0としています。
なので、必然的にG[A]とG[A]は同じ要素になります。
このとき、このグラフの頂点たちをグループ分けして、そのグループをひとつの頂点として考えて、
新たにその頂点同士のグラフを作る、ということ考えています。
例えば、Group1(G1)を頂点①②、G2を頂点③④、G3を頂点⑤⑥というふうに3グループに分割します。
グループ分けした後、どのようにそのグループ同士を辺で繋ぐかというと、グループ間の中にある辺の中
で重みが一番小さいものを1本採択します。辺が1本も無ければ、グループ間の辺ももちろん作りません。
G1とG2を例にすると、まず元のグラフのG[1][2]とG[1][3]とG[2][3]とG[2][4]の要素を取り出して、
その中で一番小さい要素を、G1とG2の間にある辺の情報とします。
これを同様にG2とG3、G3とG1に対しても行います。
そして、新たなG1G2G3に対する以下の隣接行列G'を得ます。
G'[3+1][3+1]={{0,0,0,0},
{0,0,3,2},
{0,3,0,4},
{0,2,4,0}};
ここまでが作りたいプログラムの概要です。
このような規模の小さいグラフで、分割の情報も単純であれば、私でもプログラムすることはできるのですが、
できたらどんな頂点数でもどんな分割の仕方でも対応できる汎用性のあるプログラムにしたいのです。
一番悩んでいるのは、どのように頂点の分割を入力情報として与えたら良いのかというところです。
ややこしい話ですみませんが、よろしくお願いします。
ちなみに環境はVista/VisualC++です。