PAT 1030 最短路径

//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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值