数据结构__dijksra算法

注释很详尽了:

#include<iostream>
#include<vector>
#define maxn 1000//最大节点数
#define inf 1000000000//模拟距离无限大
int G[maxn][maxn];//邻接阵,用于比较时提取G[u][v]
using namespace std;

struct node
{
	int adjvex;//节点序号
	char data;//节点英文字母
	int weight;//权重
};

vector<node> adj[maxn];//定义邻接表
int n;//定点数

//邻接表节点创建
void createNode(char a,int i,int w=0)
{
	node temp;
	temp.adjvex = a-'a';
	temp.data = a;
	temp.weight = w;
	adj[i].push_back(temp);
}

//邻接表键入
void create()
{
	int m;
	cin >> n >> m;
	for (int i = 0; i < n; i++)
	{
		char tempA;
		cin >> tempA;
		createNode(tempA, i);
	}
	char a, b;
	int cost,aa,bb;
	for (int i = 0; i < m; i++)
	{
		cin >> a >> b >> cost;
		for (int j = 0; j < n; j++)
		{
			if (a == adj[j][0].data)
				aa = adj[j][0].adjvex;
			if (b == adj[j][0].data)
				bb = adj[j][0].adjvex;
		}
		G[aa][bb] = cost;
		createNode(b, aa, cost);
	}
}

//打印邻接表
void print()
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < adj[i].size(); j++)
		{
			cout << adj[i][j].data <<adj[i][j].weight << ' ';
		}
		cout << endl;
	}
}

int d[maxn];//起点到达各点的最短路径长度
bool vis[maxn] = { false };//标记数组是否被访问

void dijkstra(int s)//s为起点
{
	fill(d, d + maxn, inf);//初始化d数组全为inf
	d[s] = 0;//起点到自身距离
	for (int i = 0; i < n; i++)//循环n趟
	{
		int u = -1, min = inf;//u使d[u]最小min存放最小的d[u]
		for (int j = 0; j < n; j++)
		{
			if (vis[j] == false && d[j] < min)
			{
				u = j;
				min = d[j];
			}
		}
		if (u == -1)return;//找不到与s相同的节点了,结束该函数
		vis[u] = true;//标记u为已访问
		for (int j=0;j<adj[u].size();j++)
		{
			int v = adj[u][j].adjvex;//通过邻接表获得u能访问的节点v
			if (vis[v] == false && d[u] + adj[u][j].weight < d[v])
				d[v] = d[u] + adj[u][j].weight;//贪心,使得更优化
		}
	}
}

int main(void)
{
	create();
	print();
	fill(G[0], G[0] + maxn * maxn, inf);
	char s;
	cin >> s;
	int ss;
	for (int j = 0; j < n; j++)
	{
		if (s == adj[j][0].data)
			ss = adj[j][0].adjvex;
	}
	dijkstra(ss);
	for (int i = 0; i < n; i++)
		cout <<adj[i][0].data <<':'<< d[i]<<' ';
	cout << endl;
	system("pause");
	return 0;
}

一组测试i/o:

数据结构__dijksra算法

数据结构__dijksra算法