#define _CRT_SECURE_NO_WARNINGS
#include<string>
#include<string.h>
#include<vector>
#include<queue>
#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
struct City
{
int dis,cost;
vector<int> q;
City()
{
dis = 9999;
cost = 0;
}
};
int main()
{
/*
4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20
*/
int N, M, S, D;
cin >> N >> M >> S >> D;
City **city = new City*[N];
for (int i = 0; i < N; i++)
city[i] = new City[N];
for (int i = 0; i < M; i++)
{
int City1, City2, Distance, Cost;
cin >> City1 >> City2 >> Distance >> Cost;
city[City1][City2].dis = Distance;
city[City1][City2].cost = Cost;
city[City2][City1].dis = Distance;
city[City2][City1].cost = Cost;
}
vector<int>vec;
for (int i = 0; i < N; i++)
{
if (i != S)
vec.push_back(i);
}
while (vec.size() > 0)
{
//查找最小值
int min = city[S][vec[0]].dis;
vector<int>::iterator mark = vec.begin();
vector<int>::iterator it = vec.begin();
for (; it != vec.end(); it++)
{
if (city[S][*it].dis < min)
{
min = city[S][*it].dis;
mark = it;
}
}
//
if (*mark == D)
{
cout << S<<" ";
for (int j = 0; j < city[S][*mark].q.size(); j++)
cout << city[S][*mark].q[j]<<" ";
cout << D << " " << city[S][*mark].dis <<" "<< city[S][*mark].cost;
return 0;
}
for (int j = 0; j < vec.size(); j++)
{
if (vec[j] == *mark)
continue;
int iTmp = city[S][*mark].dis + city[*mark][vec[j]].dis;
if (iTmp< city[S][vec[j]].dis)
{
city[S][vec[j]].dis = iTmp;
city[S][vec[j]].q = city[S][*mark].q; city[S][vec[j]].q.push_back(*mark);
city[S][vec[j]].cost = city[S][*mark].cost + city[*mark][vec[j]].cost;
}
else if (iTmp == city[S][vec[j]].dis)
{
if (city[S][*mark].cost + city[*mark][vec[j]].cost < city[S][vec[j]].cost)
{
city[S][vec[j]].cost = city[S][*mark].cost + city[*mark][vec[j]].cost;
city[S][vec[j]].q = city[S][*mark].q; city[S][vec[j]].q.push_back(*mark);
}
}
}
//
vec.erase(mark);
}
cout << S << " ";
for (int j = 0; j < city[S][D].q.size(); j++)
cout << city[S][D].q[j] << " ";
cout << D << " " << city[S][D].dis << " " << city[S][D].cost;
return 0;
}
#include<string>
#include<string.h>
#include<vector>
#include<queue>
#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
struct City
{
int dis,cost;
vector<int> q;
City()
{
dis = 9999;
cost = 0;
}
};
int main()
{
/*
4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20
*/
int N, M, S, D;
cin >> N >> M >> S >> D;
City **city = new City*[N];
for (int i = 0; i < N; i++)
city[i] = new City[N];
for (int i = 0; i < M; i++)
{
int City1, City2, Distance, Cost;
cin >> City1 >> City2 >> Distance >> Cost;
city[City1][City2].dis = Distance;
city[City1][City2].cost = Cost;
city[City2][City1].dis = Distance;
city[City2][City1].cost = Cost;
}
vector<int>vec;
for (int i = 0; i < N; i++)
{
if (i != S)
vec.push_back(i);
}
while (vec.size() > 0)
{
//查找最小值
int min = city[S][vec[0]].dis;
vector<int>::iterator mark = vec.begin();
vector<int>::iterator it = vec.begin();
for (; it != vec.end(); it++)
{
if (city[S][*it].dis < min)
{
min = city[S][*it].dis;
mark = it;
}
}
//
if (*mark == D)
{
cout << S<<" ";
for (int j = 0; j < city[S][*mark].q.size(); j++)
cout << city[S][*mark].q[j]<<" ";
cout << D << " " << city[S][*mark].dis <<" "<< city[S][*mark].cost;
return 0;
}
for (int j = 0; j < vec.size(); j++)
{
if (vec[j] == *mark)
continue;
int iTmp = city[S][*mark].dis + city[*mark][vec[j]].dis;
if (iTmp< city[S][vec[j]].dis)
{
city[S][vec[j]].dis = iTmp;
city[S][vec[j]].q = city[S][*mark].q; city[S][vec[j]].q.push_back(*mark);
city[S][vec[j]].cost = city[S][*mark].cost + city[*mark][vec[j]].cost;
}
else if (iTmp == city[S][vec[j]].dis)
{
if (city[S][*mark].cost + city[*mark][vec[j]].cost < city[S][vec[j]].cost)
{
city[S][vec[j]].cost = city[S][*mark].cost + city[*mark][vec[j]].cost;
city[S][vec[j]].q = city[S][*mark].q; city[S][vec[j]].q.push_back(*mark);
}
}
}
//
vec.erase(mark);
}
cout << S << " ";
for (int j = 0; j < city[S][D].q.size(); j++)
cout << city[S][D].q[j] << " ";
cout << D << " " << city[S][D].dis << " " << city[S][D].cost;
return 0;
}