PAT甲级1018. Public Bike Management

题意:

杭州市有公共自行车服务,为世界各地的游客提供了极大的便利。人们可以在任何一个车站租一辆自行车,并将其送回城市的任何其他车站。

公共自行车管理中心(PBMC)不断监测所有车站的实时能力。

如果一个车站正好半满,那么一个车站据说处于完美的状态。如果车站充满或空,PBMC将收集或发送自行车,以调整该车站的状况。此外,所有的车站也将进行调整。

当报告问题站时,

PBMC将始终选择到达该站的最短路径。如果有多于一条最短路径,则需要从PBMC发送的最少数量的自行车。

图1

图1说明了一个例子。站点由顶点表示,道路对应于边缘。

边缘上的数字是从另一个终端站到达一个终端站所需的时间。在顶点S内写入的数字是在S存储的自行车的当前数量。假设每个站的最大容量为10.为了解决S3处的问题,我们有两个不同的最短路径:

  1. PBMC - > S1 - > S3。在这种情况下,必须从PBMC发送4辆自行车,

    因为我们可以从S1收集1辆自行车,然后搭载5辆自行车到S3,这样两个车站都将处于完美的状态。

  2. PBMC - > S2 - > S3。这条路径需要与路径1相同的时间,但是只有3条自行车从PBMC发送,因此是将被选择的自行车。

输入规格:

每个输入文件包含一个测试用例。对于每种情况,

第一行包含4个数字:Cmax(<= 100),始终是偶数,是每个站的最大容量; N(<= 500),车站总数; Sp,问题站的索引(站号从1到N编号,PBMC由顶点0表示);和M,道路的数量。第二行包含N个非

负数Ci(i = 1,... N)其中每个Ci分别为Si处的当前自行车数。然后M行跟随,每个包含3个数字:Si,Sj和Tij,其描述了在站Si和Sj之间移动的时间Tij。一行中的所有数字都以空格分隔。

输出规格:

对于每个测试用例,

在一行中打印结果。首先输出PBMC必须发送的自行车数量。然后在一个空格之后,输出路径,格式如下:0-> S1 - > ...-> Sp。最后在另一个空间之后,输出我们必须在Sp的条件调整完美后我们必须收回PBMC的自行车数量。

请注意,如果这样的路径不是唯一的,

输出一个需要最少数量的自行车,我们必须收回到PBMC。法官的数据保证这样的道路是独一无二的。

思路:

  1. Dijkstra求出最短路径的长度。
  2. dfs求出所有最短路径的可能情况,放入vector
  3. 写一个vector的cmp函数排序,输出第一个元素就好了

注意点:

  • back的自行车不能送回已经遍历过的点。比如2 10,就是send = 3, back = 5 而不是 send = 2, back = 2;
  • 排序的地方。第7个测试点。相同路径长度排序应该是先比较send较小的情况,其次在比较back较小的情况。 很多别的博主都没提到。不然第7个测试点是不能过的。

ac代码:

C++

// pat1018.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h" #include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstring>
#include<unordered_map> using namespace std; const int MAX = 0x7fffffff;
int map[505][505];
int station[505];
bool visit[505];
int dis[505];
vector<vector<int> > res;
int mcap; void init(int n)
{
res.clear();
for (int i = 0; i <= n; i++)
{
station[i] = 0;
visit[i] = false;
dis[i] = i == 0 ? 0 : MAX;
for (int j = 0; j <= n; j++)
{
map[i][j] = i == j ? 0 : MAX;
}
}
} void Dijkstra(int n)
{
int minst, minlong;
while (1)
{
minst = -1;
minlong = MAX;
for (int i = 0; i <= n; i++)
{
if (!visit[i] && dis[i] < minlong)
{
minlong = dis[i];
minst = i;
}
}
if (minst == -1) break;
visit[minst] = true; for (int i = 1; i <= n; i++)
{
if (!visit[i] && map[i][minst] != MAX && minlong + map[i][minst] < dis[i])
dis[i] = minlong + map[i][minst];
}
}
} void dfs(vector<int>& temp, int sum, int ending, int cur, int n)
{
if (sum > dis[ending]) return;
if (cur == ending && sum == dis[ending])
{
res.push_back(temp);
} for (int i = 1; i <= n; i++)
{
if (!visit[i] && map[cur][i] != MAX)
{
visit[i] = true;
temp.push_back(i);
dfs(temp, sum + map[cur][i], ending, i, n);
visit[i] = false;
temp.pop_back();
}
}
} void count(vector<int>& a,int& send,int& back)
{
send = back = 0;
int stanard = mcap / 2;
for (int i = 1; i < a.size(); i++)
{
if (station[a[i]] > stanard) back += station[a[i]] - stanard;
else if (station[a[i]] < stanard)
{
if (stanard - station[a[i]] - back >= 0)
{
send += stanard - station[a[i]] - back;
back = 0;
}
else
{
back -= stanard - station[a[i]];
}
}
}
} static bool cmp(vector<int> a, vector<int> b)
{
int asend = 0, bsend = 0, aback = 0, bback = 0;
count(a, asend, aback);
count(b, bsend, bback);
//return asend + aback < bsend + bback;
if (asend != bsend) return asend < bsend;
else return aback < bback;
} int main()
{
int nums, ending, mroads;
cin >> mcap >> nums >> ending >> mroads;
init(nums);
int temp;
for (int i = 1; i <= nums; i++)
{
cin >> station[i];
} int s1, s2, t;
for (int i = 0; i < mroads; i++)
{
cin >> s1 >> s2 >> t;
map[s1][s2] = t;
map[s2][s1] = t;
if (s1 == 0) dis[s2] = t;
if (s2 == 0) dis[s1] = t;
} Dijkstra(nums);
memset(visit, false, sizeof(visit));
vector<int> te(1,0);
dfs(te, 0, ending, 0, nums);
sort(res.begin(), res.end(), cmp);
int mysend = 0, myback = 0;
count(res[0], mysend, myback);
cout << mysend << " ";
for (int i = 0; i < res[0].size(); i++)
{
if (i == res[0].size() - 1) cout << res[0][i] << " ";
else cout << res[0][i] << "->";
}
cout << myback << endl;
return 0;
}

PAT甲级1018. Public Bike Management的更多相关文章

  1. PAT 甲级 1018 Public Bike Management (30 分)(dijstra+dfs,dfs记录路径,做了两天)

    1018 Public Bike Management (30 分)   There is a public bike service in Hangzhou City which provides ...

  2. 【PAT甲级】Public Bike Management 题解

    题目描述 There is a public bike service in Hangzhou City which provides great convenience to the tourist ...

  3. PAT甲级——A1018 Public Bike Management

    There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...

  4. PAT Advanced 1018 Public Bike Management (30) [Dijkstra算法 + DFS]

    题目 There is a public bike service in Hangzhou City which provides great convenience to the tourists ...

  5. PAT A 1018. Public Bike Management (30)【最短路径】

    https://www.patest.cn/contests/pat-a-practise/1018 先用Dijkstra算出最短路,然后二分答案来验证,顺便求出剩余最小,然后再从终点dfs回去求出路 ...

  6. PAT 1018 Public Bike Management[难]

    链接:https://www.nowcoder.com/questionTerminal/4b20ed271e864f06ab77a984e71c090f来源:牛客网PAT 1018  Public ...

  7. PAT 1018 Public Bike Management(Dijkstra 最短路)

    1018. Public Bike Management (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...

  8. PAT 1018. Public Bike Management

    There is a public bike service in Hangzhou City which provides great convenience to the tourists fro ...

  9. 1018. Public Bike Management (30)

    时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue There is a public bike service i ...

随机推荐

  1. 关于select联动的两种做法

    第一种方法: function dong(){      var getSheng = document.getElementById("sheng");      var get ...

  2. Codeforces Round #434 (Div. 2)

    Codeforces Round #434 (Div. 2) 刚好时间对得上,就去打了一场cf,发现自己的代码正确度有待提高. A. k-rounding 题目描述:给定两个整数\(n, k\),求一 ...

  3. caffe Python API 之可视化

    一.显示各层 # params显示:layer名,w,b for layer_name, param in net.params.items(): print layer_name + '\t' + ...

  4. 全局应用程序类(Global.asax)

     注:该部分参考的园区的“积少成多”的 <ASP.NET MVC中的Global.asax文件> . 1.Global.asax文件介绍 global.asax这个文件包含全局应用程序事件 ...

  5. leetcode Two Sum II - Input array is sorted <面试常考题>

    题目描述 //二分查找的变形   用头尾两个指针进行  面试考察题 class Solution { public: vector<int> twoSum(vector<int> ...

  6. 2、gitlab 新建项目

    一.创建项目 1.访问gitlab并登录 http://git.xh.com/ 2.点击 Projects -> Starred projects 每个版本的gitlab不太一样但位置都差不多 ...

  7. P3960 列队

    这是NOIP 2017最后一道题 不知道这道题有没有人代码写的和我一样麻烦. Solution 30分暴力 维护每行每列的元素. 每次删除一个元素的时候, 需要修改一行一列 因此复杂度上界\(O(nm ...

  8. sad 关于一些html5新属性还需要用https才能支持

    像我昨天在搞一个录音的小东西 在本地正常录音正常播放 但是放到线上环境http环境上就出现了如上的错误 功能都不能正常使用 然后就改成https线上环境  然后就正常了 如上 大家有什么赐教的欢迎留言 ...

  9. go的匿名组合

    golang也提供了继承机制,但采用组合的文法,因此称为匿名组合.与其他语言不同, golang很清晰地展示出类的内存布局是怎样的. 一  非指针方式的组合 1)基本语法 type base stru ...

  10. 教你如何更改android应用的包名

    Android 源码自带了很多应用程序,想改个包名方便修改?很简单,两步搞定,以packages/apps/Settings为例: 1.打开AndroidManifest.xml,把 <mani ...