//1030 最短路径
#include <iostream>
#include <vector>
using namespace std;
int Dist[505 ][505] = {0};
int Cost[505][505] = {0};
int N, M, S, D;
int CurrDis = 0;
int ShortDis = 10000;
int visit[505] = {0};
vector<int> CurRoad;
vector<int> Road;
int TotalCost = 10000;
int CurCost = 0;
void dfs( int curr)
{
int i;
if( curr == D)
{
if (CurrDis < ShortDis)
{
ShortDis = CurrDis;
Road.clear();
for (i = 0;i<CurRoad.size();i++)
{
Road.push_back(CurRoad[i]);
}
TotalCost = CurCost;
}
else if(CurrDis == ShortDis)
{
if (TotalCost > CurCost)
{
TotalCost = CurCost;
Road.clear();
for (i = 0;i<CurRoad.size();i++)
{
Road.push_back(CurRoad[i]);
}
}
}
return;
}
for (i = 0;i<N;i++)
{
if (Dist[i][curr]> 0 && i!= curr && visit[i] == 0)
{
CurrDis += Dist[i][curr];
visit[i] = 1;
CurRoad.push_back(i);
CurCost += Cost[i][curr];
dfs(i);
visit[i] = 0;
CurrDis -= Dist[i][curr];
CurRoad.pop_back();
CurCost -= Cost[i][curr];
}
}
}
int main()
{
cin >> N >> M >> S >> D;
int i;
int City1, City2, Dis, Cos;
for (i = 0;i< M;i++)
{
cin >> City1 >> City2 >> Dis >> Cos;
Dist[City1][City2] = Dis;
Dist[City2][City1] = Dis;
Cost[City1][City2] = Cos;
Cost[City2][City1] = Cos;
}
dfs(S);
cout << S << " ";
for (i = 0; i<Road.size();i++)
{
cout << Road[i] << " ";
}
cout << ShortDis << " "<<TotalCost;
return 0;
}
PAT 1030 最短路径
最新推荐文章于 2021-09-05 10:12:41 发布