1030. Travel Plan (30)

#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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值