1030

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zero_1778393206/article/details/87885391

Dijkstra+DFS 写的很混乱 

#include<iostream>
#include<stack>
using namespace std;
#define N 510
#define INF 0xfffffff
typedef struct map
{
	int distance, cost;
}Map;

Map M[N][N];
bool Visited[N] = { false };
Map Distance[N];
bool Path[N][N];

void init();
void Dijkstra();
void DFS(int v,int dis,int cost);
int n, m, s, d;
stack<int> A,B;
int main()
{
	cin >> n >> m >> s >> d;
	init();
	for (int i = 0; i < m; i++)
	{
		int a, b, d, c;
		cin >> a >> b >> d >> c;
		M[a][b] = M[b][a] = { d,c };
	}
	Dijkstra();
	for (int i = 0; i < n; i++)
	{
		Visited[i] = false;
	}
	DFS(s,0,0);
	A = B;
	while (!B.empty())
		B.pop();
	while (!A.empty())
	{
		B.push(A.top());
		A.pop();
	}
	while (!B.empty())
	{
		cout << B.top() << ' ';
		B.pop();
	}
	cout << Distance[d].distance << ' ' << Distance[d].cost << endl;
	system("pause");
	return 0;
}
void DFS(int v,int dis,int cost)
{
	Visited[v] = true;
	A.push(v);
	if (v == d)
	{
		if (dis == Distance[d].distance&&cost == Distance[d].cost)
			B = A;
	}
	for (int i = 0; i < n; i++)
	{
		if (!Visited[i] &&  M[v][i].distance < INF)
			DFS(i,dis+M[v][i].distance,cost+M[v][i].cost);
	}

	Visited[v] = false;
	A.pop();
}
void Dijkstra()
{
	Visited[s] = true;
	for (int i = 0; i < n; i++)
	{
		Distance[i] = M[s][i];
		for (int j = 0; j < n; j++)
			Path[i][j] = false;
		if (Distance[i].distance < INF)
		{
			Path[i][s] = true;
			Path[i][i] = true;
		}

	}
		
	for (int i = 0; i < n; i++)
	{
		int dis = INF, k = -1;
		for (int j = 0; j < n; j++)
		{
			if (Distance[j].distance < dis && !Visited[j])
			{
				dis = Distance[j].distance;
				k = j;
			}
		}
		if (k == -1)
			return;
		Visited[k] = true;
		for (int j = 0; j < n; j++)
		{
			if (!Visited[j] && ((Distance[j].distance > Distance[k].distance + M[k][j].distance) ||
				(Distance[j].distance == Distance[k].distance + M[k][j].distance&&Distance[j].cost > Distance[k].cost + M[k][j].cost)))
			{
				Distance[j].distance = Distance[k].distance + M[k][j].distance;
				Distance[j].cost = Distance[k].cost + M[k][j].cost;

				for (int t = 0; t < n; t++)
					Path[j][t] = Path[k][t];
				Path[j][j] = true;
			}
		}
	}

}
void init()
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (i == j)
				M[i][j] = { 0,0 };
			else
				M[i][j] = { INF,INF };
		}
	}

}

猜你喜欢

转载自blog.csdn.net/zero_1778393206/article/details/87885391