- 算法思想
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200607102233346.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JpY2VfXw==,size_16,color_FFFFFF,t_70#pic_center)
- 算法伪代码
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200607102327651.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JpY2VfXw==,size_16,color_FFFFFF,t_70#pic_center)
- 测试用例过程
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200607102409371.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JpY2VfXw==,size_16,color_FFFFFF,t_70#pic_center)
- 代码实现
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <iomanip>
using namespace std;
#define max 110
#define INF 0xfffff
int n;
struct node
{
int vlue;
int key;
int parent;
friend bool operator<(node a, node b)
{
return a.key > b.key;
}
};
void Init(int **G)
{
cout << "输入图:边 边 权 000结束"<<endl;
int i, j;
int v;
scanf_s("%d%d%d", &i, &j, &v);
while (i || j || v)
{
G[i][j] = v;
scanf_s("%d%d%d", &i, &j, &v);
}
cout << endl;
}
void Dijkstra(int **G, int s)
{
priority_queue<node> q;
node d[max];
bool visited[max];
for (int i = 1; i <= n; i++)
{
d[i].vlue = i;
d[i].key = INF;
d[i].parent = -1;
visited[i] = false;
}
d[s].key = 0;
q.push(d[s]);
while (!q.empty())
{
node cd = q.top();
q.pop();
int u = cd.vlue;
if (visited[u])
continue;
visited[u] = true;
cout << "访问:" << u<<" 距离:"<<d[u].key<<" 父结点:"<< d[u].parent<< endl;
for (int i = 1; i < n;i++) {
if (!visited[i] && d[i].key>d[u].key+G[d[u].vlue][i])
{
d[i].parent = u;
d[i].key = d[u].key + G[d[u].vlue][i];
q.push(d[i]);
}
}
}
}
int main()
{
printf("请输入顶点数:\n");
cin>>n;
n++;
int** G = (int**) new int* [n];
for (int i = 0; i < n; i++)
{
G[i] = new int[n];
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
G[i][j] = INF;
}
cout << endl;
}
Init(G);
for (int i = 1; i < n; i++)
{
for (int j = 1; j < n; j++)
{
if (G[i][j] != INF)
cout << setw(2) << G[i][j] << " ";
else
cout << setw(2) << 0 << " ";
}
cout << endl;
}
Dijkstra(G,1);
for (int i = 0; i < n; i++)
{
delete[] G[i];
}
delete G;
return 0;
}