#include<iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 1000
#define infin 65555
int parent[maxn + 1] = { -1 };
struct edgenode
{
	int y;
	int weight;
	edgenode* next;
};
struct graph
{
	edgenode* edges[maxn + 1];
	int degree[maxn + 1];
	int nvertices;
	int nedges;
	bool directed;
};
void init_graph(graph* G, bool directed)
{
	int i;
	G->nvertices = 0;
	G->nedges = 0;
	G->directed = directed;
	for (i = 1; i <= maxn; i++)
	{
		G->degree[i] = 0;
	}
	for (i = 1; i < maxn; i++)
	{
		G->edges[i] = NULL;
	}
}
void insert_edge(graph* G, int x, int y, int weight, bool directed)
{
	edgenode* p;
	p = new edgenode;
	p->weight = weight;
	p->y = y;
	p->next = G->edges[x];

	G->edges[x] = p;
	G->degree[x]++;
	if (directed == false)
	{
		insert_edge(G, y, x, weight, true);
	}
	else
	{
		G->nedges++;
	}
 }

void read_graph(graph* G, bool directed)
{
	int i, m;
	int x, y;
	int weight;
	init_graph(G, directed);
	cout << "点的数量:";
	cin >> G->nvertices;
	cout << "边的数量:";
	cin >> m;
	for (i = 1; i <= m; i++)
	{
		cout << "从此点出发:";
		cin >> x;
		cout << "到此点:";
		cin >> y;
		cout << "输入边的权重:";
		cin >> weight;
		insert_edge(G, x, y, weight, directed);
	}
}

void print_graph(graph* G)
{
	int i;
	edgenode* p;
	cout << "Vertex\tConnected" << endl;
	for (i = 1; i < G->nvertices; i++)
	{
		cout << i << "\t";
		p = G->edges[i];
		while (p != NULL)
		{
			cout << i << "\t";
			p = p->next;
		}
		cout << endl;
	}
}

void find_path(int start, int end, int parents[])
{
	if ((start == end) || (end == -1))
	{
		cout << endl << start;
	}
	else
	{
		find_path(start, parents[end], parents);
		cout << " " << end;
	}
}

void djikstra(graph* G, int start)
{
	int i;
	edgenode* p;
	bool intree[maxn + 1];
	int distance[maxn + 1];
	int v, w;
	int weight;
	int dist;
	for (i = 1; i <= G->nvertices; i++)
	{
		intree[i] = false;
		distance[i] = infin;
		parent[i] = -1;
	}
	distance[start] = 0;
	v = start;
	while (intree[v] == false)
	{
		intree[v] = true;
		p = G->edges[v];
		while (p != NULL)
		{
			w = p->y;
			weight = p->weight;
			if (distance[w] > distance[v] + weight)
			{
				distance[w] = distance[v] + weight;
				parent[w] = v;
			}
			p = p->next;
		}
		v = 1;
		dist = infin;
		for (i = 1; i <= G->nvertices; i++)
		{
			if ((intree[i] == false) && (dist > distance[i]))
			{
				dist = distance[i];
				v = i;
			}
		}
	}
}

int main()
{
	graph G;
	int start;
	int end;
	read_graph(&G, 0);
	print_graph(&G);
	cout << "输入起点 :";
	cin >> start;
	cout << "输入终点 :";
	cin >> end;
	djikstra(&G, start);
	if (parent[end] == -1 && start != end)
	{
		cout << "路径不存在";
	}
	else
	{
		cout << "路径从 " << start << "到" << end << "如下: ";
		find_path(start, end, parent);
	}
	return 0;
}