マップ
定義
タプル、G =(V、E)
V:頂点の有限集合
E:有限集合側関係
無向グラフ(エッジ)と有向グラフ(ARC)に
機能
データ構造との関係図のメッシュノードの一種類は任意であり、すなわち図は、おそらく任意の2つのノード間の直接的な相関関係であります
基本用語
頂点は:図の中のデータ要素の
エッジ/円弧:2つの頂点間の関係は、
完全に:有しN(N-1)/ 2を図の物品に縁なし
全く導か:N(N-1)エッジを有します有向グラフ
図稠密:図の多くの側面又はアークがあるが
疎:少しエッジを有するか、図アーク
G =(V、E)とGのための「=(V」、E:サブグラフ 「) V場合'VおよびEのサブセットである「Gと呼ばれ、EのサブセットであるGのサブグラフであります
右:図関連付けられたエッジ値
ネットワーク:図加重
隣接点は:G =(V、E)、存在する場合(X、Y)∈Eについて、隣接するXおよびYなしグラフが導か前記しました図に隣接するYにX前記
頂点の:辺の数に関連付けられている点が、描画への浸透度を有する
パス:Gで、Yはトップ、到達頂点の頂点リストからの経過xは頂点の配列(X、...、y)は、XからYへのパスであるであることを特徴とする
非重み付きグラフパス辺側及び右映像ショーの右上の数テープ経路:経路長
回路(ループ):最初の頂点最後の頂点と同じパス
通信:図中、そこにXからYへのパス、Xであり、Yが非連通と呼ばれている場合
との通信:任意の二つのXは、Yが間にある場合無向グラフG、頂点接続されて、接続グラフGがグラフであることを特徴とする
コンポーネントを接続:サブグラフなしの最大通信が
強いグラフ:図Xの頂点のうちのいずれか2つ、yは到達間それぞれ、図中のGは述べています。強連結グラフである
に向け大きな通信サブグラフ:強連結成分
ツリー:1のn-エッジ最小接続サブグラフ(非巡回グラフ)、N頂点
図のシンプルなメモリ構造。
配列表記(隣接行列)
①隣接マトリックス:マトリックスは、隣接する頂点間の関係を表す
エッジが存在する(X、Y)、即ち、AXY = 1(または重量)、またはAXYを= 0(または∞)
②の特性隣接行列
無向グラフの隣接マトリックス対称行列である
無向隣接行列の行は∞/ FIG /列の非ゼロのI i番目頂点の要素の数である
非ゼロ/∞i番目の行の隣接行列の要素の数と度、i番目度として
、例えば:
例:
//使用数组存储图
class SimpleMap{
//顶点个数
public int num;
//图
public int[][] map;
}
public static final int MAX=100000;
/**
* 根据文件内容,生成一个无向图图
* @param file 文件路径
* @return 存储图数据的二阶数组
*/
public static SimpleMap createMap(String file){
SimpleMap sMap = new SimpleMap();
BufferedReader bReader = null;
try {
bReader = new BufferedReader(new FileReader(file));
String data = bReader.readLine();
int number = Integer.parseInt(data);
sMap.num = number;
sMap.map = new int[number][number];
//初始化图
for(int i=0; i<number; i++) {
for(int j=0; j<number; j++) {
sMap.map[i][j] = MAX;
if(i == j) {
sMap.map[i][j] = 0;
}
}
}
//读取文件,初始化边
while((data=bReader.readLine()) != null) {
String[] value = data.split("&");
int x = Integer.parseInt(value[0])-1;
int y = Integer.parseInt(value[1])-1;
int info = Integer.parseInt(value[2]);
sMap.map[x][y] = info;
sMap.map[y][x] = info;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(bReader != null) {
bReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return sMap;
}
スタイルファイルが格納されている:
最初の行為の頂点の数を、二次行列のサイズを決定する; ---- 2の後方、すなわち、1~6の重量と
隣接リスト(隣接リスト)
最初のノード:データ(頂点)、firstarc(ポインタフィールド)
表ノード:adjcex(データフィールド)、INFO(重量)、nextarc(標的ドメイン)
として:
例:
//使用静态链表存储图
//头结点
class HeadNode{
//结点入度
public int imNum;
//结点数据
public String data;
//结点输出
public MidNode nextIndex;
}
//表结点
class MidNode{
//数据
public String data;
//权值
public int info;
//下一位
public MidNode nextIndex;
}
/**
* 使用静态链表构建一个有向图
* @param file 文件输入
* @return 生成的静态链表
*/
public static HeadNode[] createDirectMap(String file) {
HeadNode[] mapHead = null;
BufferedReader bReader = null;
try {
bReader = new BufferedReader(new FileReader(file));
String data = bReader.readLine();
String[] value = data.split("&");
int number = Integer.parseInt(value[0]);
mapHead = new HeadNode[number];
//初始化静态链表头
for(int i=0; i<number; i++) {
mapHead[i] = new HeadNode();
mapHead[i].imNum = 0;
mapHead[i].data = value[1].substring(i, i+1);
mapHead[i].nextIndex = null;
}
//构建静态链表
while((data = bReader.readLine()) != null) {
value = data.split("&");
String fromData = value[0];
String toData = value[1];
int info = Integer.parseInt(value[2]);
for(int i=0; i<number; i++) {
//当该结点是出点时,新建结点
if(mapHead[i].data.equals(fromData)) {
MidNode mNode = new MidNode();
mNode.data = toData;
mNode.info = info;
//链接
mNode.nextIndex = mapHead[i].nextIndex;
mapHead[i].nextIndex = mNode;
}else if(mapHead[i].data.equals(toData)) {
//当该结点是入点时,入度加一
mapHead[i].imNum ++;
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(bReader != null) {
bReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return mapHead;
}
スタイルファイルが格納されている:
第一名&行動の頂点の頂点数、すなわちA-> B、1の重量の後ろ