1、图的邻接表和邻接矩阵存储
建立下图的邻接表或邻接矩阵,并输出之;
2、图的各种遍历算法实现
以0结点为起点实现上述图的深度优先和广度优先遍历算法;
3、最小生成树的算法实现
利用普里姆(Prim)算法或克鲁斯卡尔(Kruskal)算法求上图的最小生成树,算法实现代码必须有注释。
4、最短路径的算法实现
利用狄克斯特拉(Dijkstra)算法求上图中0结点到其它结点的最短路径,算法实现代码必须有注释。
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int a[7] = { 0,1,2,3,4,5,6 };
int j[7][7] = {0};
j[0][1] = 1;
j[0][5] = 1;
j[5][4] = 1;
j[4][3] = 1;
j[3][2] = 1;
j[2][1] = 1;
j[4][6] = 1;
j[6][1] = 1;
j[6][3] = 1;
for (int i = 0;i < 7;i++)
{
for (int k = 0;k < 7;k++)
{
if (j[i][k] != 0)
{
j[k][i] = j[i][k];
}
}
}
cout << " " << setw(5) << "0"<<setw(5)<<"1" << setw(5)<<"2" << setw(5)<<"3" << setw(5)<<"4" << setw(5)<<"5" << setw(5)<<"6" << endl;
for (int i = 0;i < 7;i++)
{
cout << i ;
for (int k = 0;k < 7;k++)
{
cout << setw(5) << j[i][k];
}
cout << endl;
}
}
#include<iostream>
#include<iomanip>
#include <queue>
using namespace std;
int a[7] = { 0,1,2,3,4,5,6 };
int j[7][7] = { 0 };
void create()
{
j[0][1] = 28;
j[0][5] = 10;
j[5][4] = 25;
j[4][3] = 22;
j[3][2] = 12;
j[2][1] = 16;
j[4][6] = 24;
j[6][1] = 14;
j[6][3] = 18;
for (int i = 0;i < 7;i++)
{
for (int k = 0;k < 7;k++)
{
if (j[i][k] != 0)
{
j[k][i] = j[i][k];
}
}
}
cout << " " << setw(5) << "0" << setw(5) << "1" << setw(5) << "2" << setw(5) << "3" << setw(5) << "4" << setw(5) << "5" << setw(5) << "6" << endl;
for (int i = 0;i < 7;i++)
{
cout << i;
for (int k = 0;k < 7;k++)
{
cout << setw(5) << j[i][k];
}
cout << endl;
}
}
bool record[7] = { false };
void DFS(int arr[7][7], int node)//深度优先搜索
{
cout << node<< " ";
record[node] = true;
for (int w = 0;w < 7;w++)
{
if (arr[node][w] != 0 && !record[w])
{
DFS(arr, w);
}
}
}
//广度优先搜索
int Firstadjvex(int arr[7][7],int i)//i的第一个邻接点
{
for (int k = 0;k < 7;k++)
{
if (arr[i][k] != 0)
return k;
}
}
int Nextadjvex(int arr[7][7], int i, int w)//i相对于w的下一个邻接点
{
if (w < 7)
{
for (int k = w+1;k < 7;k++)
{
if (arr[i][k] != 0)
return k;
}
}
else
return -1;
}
queue<int> q;//构建队列
int u = 0;
void BFS(int arr[7][7], int node)
{
bool record[7] = { false };
cout << node << " ";
record[node] = true;
q.push(node);
u = node;
while (!q.empty())
{
u = q.front();
q.pop();
int w = Firstadjvex(arr, u);
for (w;w >= 0;w = Nextadjvex(arr, u, w))
{
if (!record[w])
{
cout << w << " ";
record[w] = true;
q.push(w);
}
}
}
}
int main()
{
create();
cout << "------------------------" << endl;
cout << "深度优先搜索:" << endl;
DFS(j, 0);//深度优先搜索
cout <<endl<< "------------------------" << endl;
cout << "广度优先搜索:" << endl;
BFS(j, 0);
}
#include<iostream>
#include<iomanip>
using namespace std;
int a[7] = { 0,1,2,3,4,5,6 };
int j[7][7] = { 0 };
int s[9] = { 0 };
int num = 0;
int i1 = 0;
struct edge//结点
{
int from, to;
int weight;
};
void create()//创建邻接矩阵
{
j[0][1] = 28;
j[0][5] = 10;
j[5][4] = 25;
j[4][3] = 22;
j[3][2] = 12;
j[2][1] = 16;
j[4][6] = 24;
j[6][1] = 14;
j[6][3] = 18;
for (int i = 0;i < 7;i++)
{
for (int k = 0;k < 7;k++)
{
if (j[i][k] != 0)
{
j[k][i] = j[i][k];
}
}
}
cout << " " << setw(5) << "0" << setw(5) << "1" << setw(5) << "2" << setw(5) << "3" << setw(5) << "4" << setw(5) << "5" << setw(5) << "6" << endl;
for (int i = 0;i < 7;i++)
{
cout << i;
for (int k = 0;k < 7;k++)
{
cout << setw(5) << j[i][k];
}
cout << endl;
}
}
void MiniSpanTree_Kruskal(int arr[7][7])
{
//将边排序
bool judge[7][7] = { false };
for (int i = 0;i < 7;i++)
{
for (int j = 0;j < 7;j++)
{
if (arr[i][j] != 0 && judge[i][j] == false)
{
judge[i][j] = true;
judge[j][i] = true;
num++;
}
}
}
int i1 = 0;
bool judge1[7][7] = { false };
edge* e = new edge[num];
for (int i = 0;i < 7;i++)
{
for (int j = 0;j < 7;j++)
{
if (arr[i][j] != 0 && judge1[i][j] == false)
{
judge1[i][j] = true;
judge1[j][i] = true;
e[i1].weight = arr[i][j];
e[i1].from = i;
e[i1].to = j;
i1++;
}
}
}
for (int i = 0;i < num;i++)//将排好的边存入
{
for (int j = i + 1;j<num;j++)
{
if (e[i].weight > e[j].weight)
{
edge temp = e[i];
e[i] = e[j];
e[j] = temp;
}
}
}
//生成树
bool judge2[7] = { false };
edge e1[6];
e1[0] = e[0];
judge2[(e1[0].from)] = true;
judge2[(e1[0].to)] = true;
int count = 1;
for (int i = 1;i < num;i++)
{
if (!judge2[e[i].to])
{
e1[count] = e[i];
count++;
judge2[e[i].to] = true;
}
}
for (int i = 0;i < 6;i++)
{
cout << e1[i].from << "-" << e1[i].weight << "-" << e1[i].to << endl;
}
}
int main()
{
create();
cout << "--------------最小生成树---------------" << endl;
MiniSpanTree_Kruskal(j);
}
#include<iostream>
#include<iomanip>
using namespace std;
#include<stack>
int a[7] = { 0,1,2,3,4,5,6 };
int j[7][7] = { 0 };
int num = 0;
int u = 0;
struct edge//结点
{
int from, to;
int weight;
int distant = 100;
};
void create()
{
j[0][1] = 28;
j[0][5] = 10;
j[5][4] = 25;
j[4][3] = 22;
j[3][2] = 12;
j[2][1] = 16;
j[4][6] = 24;
j[6][1] = 14;
j[6][3] = 18;
for (int i = 0; i < 7; i++)
{
for (int k = 0; k < 7; k++)
{
if (j[i][k] != 0)
{
j[k][i] = j[i][k];
}
}
}
cout << " " << setw(5) << "0" << setw(5) << "1" << setw(5) << "2" << setw(5) << "3" << setw(5) << "4" << setw(5) << "5" << setw(5) << "6" << endl;
for (int i = 0; i < 7; i++)
{
cout << i;
for (int k = 0; k < 7; k++)
{
cout << setw(5) << j[i][k];
}
cout << endl;
}
}
int distant[7] = { 9999,9999,9999,9999,9999,9999,9999 };
int from[7] = { 0 };
bool judge[7] = { false };
int i = 0;
void Dijkstra(int arr[7][7], int d)
{
distant[0] = 0;
judge[0] = true;
while (!judge[d])
{
for (int k = 0; k < 7; k++)
{
if (j[i][k] && distant[k] >= j[i][k] + distant[i])
{
distant[k] = j[i][k] + distant[i];
from[k] = i;
}
}
int min = 999;
int record = 0;
for (int u = 0; u < 7; u++)
{
if (!judge[u] && distant[u] < min)
{
min = distant[u];//找到当前最小的距离
record = u;
}
i = record;
}
judge[i] = true;
}
int temp = d;
stack<int>s;
s.push(d);
while (from[temp] != 0)
{
temp = from[temp];
s.push(temp);
}
s.push(0);
while (!s.empty())
{
cout << s.top() << "→";
s.pop();
}
cout << "end";
}
int main()
{
create();
cout << "--------------最短路径---------------" << endl;
int d=0;
cout << "请输入你想到达的点(1-5):";
cin >> d;
Dijkstra(j, d);
}