【数据结构】图(邻接矩阵、遍历、最小生成树、最短路径)

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);
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值