您的位置:首页 > 其它

1030. Travel Plan (30)

2015-06-18 09:46 387 查看
#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*
;

for (int i = 0; i < N; i++)

city[i] = new City
;

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: