数据结构常见图类算法C语言

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int arc[4][4] = {0};
int visited[4] = {0};
void bfs(int i)
{
	queue<int> q;
	q.push(i);
	for (int i = 0; i < 4; i++)
	{
		visited[i] = 0;
	}
	while (!q.empty())
	{
		int j = q.front();
		q.pop();
		if (visited[j] == 0)
		{
			visited[j] = 1;
			cout << j << " ";
		}
		for (int i = 0; i < 4; i++)
		{
			if (arc[j][i] && (visited[i] == 0))
			{
				q.push(i);
			}
		}
	}
	cout << endl;
}
void dfs(int i)
{
	visited[i] = 1;
	cout << i << " ";
	for (int j = 0; j < 4; j++)
	{
		if (arc[i][j] && visited[j] == 0)
		{
			dfs(j);
		}
	}
}
// prim  v^2
int shortedge[4][2] = {0};
int mini_edge(void)
{
	int min = 1;
	for (int i = 1; i < 4; i++)
	{
		if (shortedge[i][0] > 0)
		{
			if (shortedge[min][0] == 0 || shortedge[min][0] > shortedge[i][0])
			{
				min = i;
			}
		}
	}
	return min;
}
void prim(void)
{
	for (int i = 1; i < 4; i++)
	{
		shortedge[i][0] = arc[0][i];
		shortedge[i][1] = 0;
	}
	for (int i = 1; i < 4; i++)
	{
		int k = mini_edge();
		cout << "arc:" << shortedge[k][1] << "->" << k << "length:" << shortedge[k][0] << endl;
		for (int i = 1; i < 4; i++)
		{
			if (arc[k][i] != 0)
			{
				if (shortedge[i][0] == 0 || shortedge[i][0] > arc[k][i])
				{
					shortedge[i][0] = arc[k][i];
					shortedge[i][1] = k;
				}
			}
		}
		shortedge[k][0] = 0;
	}
}
// kruskal eloge
int parent[4] = {0};
int find_root(int n)
{
	while (parent[n] > 0)
	{
		n = parent[n];
	}
	return n;
}
void kruskal(void)
{
	int arcnum = 0, num = 0;
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if (arc[i][j])
			{
				arcnum++;
			}
		}
	}
	for (int i = 0; i < 4; i++)
	{
		parent[i] = -1;
	}
	for (int i = 0; i < arcnum; i++)
	{
		int from = 0, to = 0, weight = 0;
		for (int i = 0; i < 4; i++)
		{
			for (int j = 0; j < 4; j++)
			{
				if (arc[i][j])
				{
					if (weight == 0 || arc[i][j] < weight)
					{
						weight = arc[i][j];
						from = i;
						to = j;
					}
				}
			}
		}
		int root1 = find_root(from);
		int root2 = find_root(to);
		if (root1 != root2)
		{
			parent[root2] = root1;
			cout << "arc:" << from << "->" << to << "length:" << weight << endl;
			num++;
			if (num == 4 - 1)
			{
				break;
			}
		}
		arc[from][to] = 0;
	}
}
// dijkstra
int dist[4];
void dijkstra(int n) // v^2
{
	int num = 0;
	for (int i = 0; i < 4; i++)
	{
		dist[i] = arc[n][i];
	}
	while (num < 3)
	{
		int k = 0;
		for (int i = 0; i < 4; i++)
		{
			if (dist[i] != 0)
			{
				if (dist[k] == 0 || dist[i] < dist[k])
				{
					k = i;
				}
			}
		}
		cout << n << "->" << k << ":" << dist[k] << endl;
		num++;
		for (int i = 0; i < 4; i++)
		{
			if (arc[k][i] != 0)
			{
				if (dist[i] == 0 || dist[k] + arc[k][i] < dist[i])
				{
					dist[i] = dist[k] + arc[k][i];
				}
			}
		}
		dist[k] = 0;
	}
}
// floyd
void floyd(void) // v^3
{
	int dist[4][4];
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			dist[i][j] = arc[i][j];
		}
	}
	for (int k = 0; k < 4; k++)
	{
		for (int i = 0; i < 4; i++)
		{
			for (int j = 0; j < 4; j++)
			{
				if (arc[i][k] != 0 && arc[k][j] != 0)
				{
					if (dist[i][j] == 0 || arc[i][k] + arc[k][j] < dist[i][j])
					{
						dist[i][j] = arc[i][k] + arc[k][j];
					}
				}
			}
		}
	}
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			cout << dist[i][j] << " ";
		}
		cout << endl;
	}
}
int main(void)
{

	arc[0][1] = 1;
	arc[1][2] = 2;
	arc[0][3] = 3;
	arc[1][3] = 1;
	arc[2][3] = 5;
	// bfs(0);
	// dfs(0);
	// prim();
	// kruskal();
	// dijkstra(0);
	floyd();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值