四、图
1.图创建
1.1邻接矩阵
#include <iostream>
using namespace std;
#define MAXLEN 100
class Graph
{
private:
int vexnum;
int matrix[MAXLEN][MAXLEN];
string vertex[MAXLEN];
int FindIndex(string v)
{
for (int i = 0; i < vexnum; i++)
if (v == vertex[i])
return i;
return -1;
}
public:
Graph(int n)
{
vexnum = n; //传入结点个数
for (int i = 0; i < vexnum; i++) //邻接矩阵初始化
{
for (int j = 0; j < vexnum; j++)
matrix[i][j] = 0;
}
for (int i = 0; i < vexnum; i++) //传入结点
cin >> vertex[i];
int edge;
cin >> edge; //传入边数
for (int i = 0; i < edge; i++)
{
string v1, v2;
cin >> v1 >> v2;
int start = FindIndex(v1);
int end = FindIndex(v2);
matrix[start][end] = 1;
matrix[end][start] = 1; //无向图的邻接矩阵为对称的
}
}
void Show()
{
for (int i = 0; i < vexnum; i++)
{
cout << vertex[i] << ' ';
}
cout << endl;
for (int i = 0; i < vexnum; i++)
{
for (int j = 0; j < vexnum; j++)
{
cout << matrix[i][j] << ' ';
}
cout << endl;
}
}
};
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
Graph m(n);
m.Show();
}
return 0;
}
/*
输入无向图顶点信息和边信息,创建图的邻接矩阵存储结构
样例输入:
2
4 A B C D
2
A B
A C
6 V1 V2 V3 V4 V5 V6
5
V1 V2
V1 V3
V2 V4
V5 V6
V3 V5
样例输出:
A B C D
0 1 1 0
1 0 0 0
1 0 0 0
0 0 0 0
V1 V2 V3 V4 V5 V6
0 1 1 0 0 0
1 0 0 1 0 0
1 0 0 0 1 0
0 1 0 0 0 0
0 0 1 0 0 1
0 0 0 0 1 0
*/
1.2邻接表
第一种写法是突发奇想,第二种算是比较正统的写法
#include <iostream>
using namespace std;
#define MAXLEN 100
class VexNode
{
public:
int index;
VexNode *next;
VexNode(int i) : index(i) {
next = NULL; }
};
class Graph
{
private:
int vexnum, edgenum;
VexNode *VN[MAXLEN];
string vexstr[MAXLEN];
int pos;
int FindIndex(string v)
{
for (int i = 0; i < vexnum; i++)
{
if (vexstr[i] == v)
return i;
}
return -1;
}
void CreateVexChain(VexNode *head, int vni)
{
VexNode *p = head;
while (p->next != NULL)
{
p = p->next;
}
VexNode *t = new VexNode(vni);
p->next = t;
}
void PrintChain(VexNode *head)
{
VexNode *p = head->next;
while (p)
{
cout << '-' << p->index;
p = p->next;
}
cout << "-^" << endl;
}
public:
Graph(int n, int k) : vexnum(n), edgenum(k)
{
for (int i = 0; i < vexnum; i++)
VN[i] = new VexNode(i);
for (int i = 0; i < vexnum; i++)
cin >> vexstr[i];
for (int i = 0; i < edgenum; i++)
{
string v1, v2;
cin >> v1 >> v2;
int start = FindIndex(v1);
int end = FindIndex(v2);
CreateVexChain(VN[start], end);
}
}
void Show()
{
for (int i = 0; i < vexnum; i++)
{
cout << i << ' ' << vexstr[i];
PrintChain(VN[i]);
}
}
};
int main()
{
int t;
cin >> t;
while (t--)
{
int n, k;
cin >> n >> k;
Graph g(n, k);
g.Show();
}
return 0;
}
/*
样例输入
1
5 7
A B C D E
A B
A D
A E
B D
C B
C E
E D
样例输出
0 A-1-3-4-^
1 B-3-^
2 C-1-4-^
3 D-^
4 E-3-^
*/
#include <iostream>
using namespace std;
#define MAXLEN 100
class ArcNode //边表结点
{
public:
int adjvex; //该弧所指向的顶点的下标
ArcNode *next; //指向下一个边表结点的指针
ArcNode() {
next = NULL; }
ArcNode(int i) : adjvex(i) {
next = NULL; }
};
class VNode //顶点表结点
{
public:
string data; //顶点信息
ArcNode *first; //指向第一条依附该顶点的弧
VNode() {
first = NULL; }
};
class ALGraph //创建图
{
private:
VNode vertices[MAXLEN]; //邻接表
//创建一个存放指向对应顶点邻接表的最后一个结点的指针
//通过该指针数组可以避免每次加入新的弧还需要遍历整条邻接表
ArcNode *pRow[MAXLEN];
int vexnum, arcnum; //顶点个数与弧数
int FindIndex(string v)
{
for (int i = 0; i < vexnum; i++)
{
if (vertices[i].data == v)
return i;
}

最低0.47元/天 解锁文章
2706

被折叠的 条评论
为什么被折叠?



