版权声明:本文为博主原创文章,未经博主允许不得转载。 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 };
}
}
}