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;
}
#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;
}
相关文章推荐
- Changes in Microsoft Dynamics AX 2012 InventTrans data model
- c语言: 修改参数的地址,及注意事项
- 使用 Google Fonts 为网页添加美观字体
- 浅谈Jquery核心函数
- Android开发第二阶段(1)
- 支持向量机(一)
- Android 解决65535的限制 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚
- 经典位操作
- batch批处理基础
- bootstrap(2)
- win32: 静态控件(Static) - SS_NOTIFY - 响应事件
- Android开发第二阶段(1)
- 读良葛格"初心者之路"有感
- C#基础语法:可空类型详解
- 通过事件调用窗体间的方法
- vc 不能将参数 1 从const char [*]转换为LPCWSTR
- IT相关找工作时间表
- sql server 语法
- malloc() 和 calloc()有啥区别
- Android(java)学习笔记111:成员位置的内部类的介绍