1018. Public Bike Management (30)
2016-02-20 11:37
609 查看
DFS找符合条件的路径
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <limits>
using namespace std;
int cmax, n, sp, m, half;
vector<bool> used;
vector<int> bikes;
vector<vector<int>> edges;
int minTime = numeric_limits<int>::max();
int minSend = numeric_limits<int>::max();
int minCollect = numeric_limits<int>::max();
vector<int> minPath;
void dfs(int s, int curTime, int curSend, int curCollect, vector<int>& curPath){
if(s == sp){
bool choosed = curTime < minTime
|| (curTime == minTime && curSend < minSend)
|| (curTime == minTime && curSend == minSend && curCollect < minCollect);
if(choosed){
minTime = curTime;
minSend = curSend;
minCollect = curCollect;
minPath = curPath;
}
return;
}
if(curTime > minTime) return;
for(int i = 1; i <= n; ++i){
if(!used[i] && edges[s][i] != -1){
used[i] = true;
curPath.push_back(i);
if(curCollect + bikes[i] < half){
dfs(i, curTime + edges[s][i], curSend + half - bikes[i] - curCollect, 0, curPath);
}else{
dfs(i, curTime + edges[s][i], curSend, bikes[i] + curCollect - half, curPath);
}
used[i] = false;
curPath.pop_back();
}
}
}
int main(){
scanf("%d%d%d%d", &cmax, &n, &sp, &m);
half = cmax / 2;
used.resize(n+1, false);
bikes.resize(n+1);
edges.resize(n+1);
for(auto& edge : edges){
edge.resize(n+1, -1);
}
for(int i = 1; i <= n; ++i){
scanf("%d", &bikes[i]);
}
for(int i = 0; i < m; ++i){
int si, sj, tij;
scanf("%d%d%d", &si, &sj, &tij);
edges[si][sj] = edges[sj][si] = tij;
}
vector<int> curPath;
dfs(0, 0, 0, 0, curPath);
printf("%d 0", minSend);
for(auto& n : minPath){
printf("->%d", n);
}
printf(" %d", minCollect);
return 0;
}
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <limits>
using namespace std;
int cmax, n, sp, m, half;
vector<bool> used;
vector<int> bikes;
vector<vector<int>> edges;
int minTime = numeric_limits<int>::max();
int minSend = numeric_limits<int>::max();
int minCollect = numeric_limits<int>::max();
vector<int> minPath;
void dfs(int s, int curTime, int curSend, int curCollect, vector<int>& curPath){
if(s == sp){
bool choosed = curTime < minTime
|| (curTime == minTime && curSend < minSend)
|| (curTime == minTime && curSend == minSend && curCollect < minCollect);
if(choosed){
minTime = curTime;
minSend = curSend;
minCollect = curCollect;
minPath = curPath;
}
return;
}
if(curTime > minTime) return;
for(int i = 1; i <= n; ++i){
if(!used[i] && edges[s][i] != -1){
used[i] = true;
curPath.push_back(i);
if(curCollect + bikes[i] < half){
dfs(i, curTime + edges[s][i], curSend + half - bikes[i] - curCollect, 0, curPath);
}else{
dfs(i, curTime + edges[s][i], curSend, bikes[i] + curCollect - half, curPath);
}
used[i] = false;
curPath.pop_back();
}
}
}
int main(){
scanf("%d%d%d%d", &cmax, &n, &sp, &m);
half = cmax / 2;
used.resize(n+1, false);
bikes.resize(n+1);
edges.resize(n+1);
for(auto& edge : edges){
edge.resize(n+1, -1);
}
for(int i = 1; i <= n; ++i){
scanf("%d", &bikes[i]);
}
for(int i = 0; i < m; ++i){
int si, sj, tij;
scanf("%d%d%d", &si, &sj, &tij);
edges[si][sj] = edges[sj][si] = tij;
}
vector<int> curPath;
dfs(0, 0, 0, 0, curPath);
printf("%d 0", minSend);
for(auto& n : minPath){
printf("->%d", n);
}
printf(" %d", minCollect);
return 0;
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性