#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;
}
数据结构常见图类算法C语言
最新推荐文章于 2024-05-20 20:08:58 发布