思路就是dijkstra找出最短路,dfs比较每一个最短路。

dijkstra可以找出每个点的前一个点, 所以dfs搜索比较的时候怎么处理携带和带走的数量就是关键,考虑到这个携带和带走和路径顺序有关,所以可以用下面的写法,看代码就可以了。

最开始的时候是想用一个偏动态规划的写法做,但是因为题目的显示,既要带去的车数量最少,又要求从一个点带走的车数量最少,所以如果过动规的话,对于一个点的多个最短路,就会选择带去数量最少,带走车数最少的路径,但是如果这个点后面的点的车辆数少一标准量的一半的话,前面带的是最少的,这样相当于携带的车的数量就多了,这样就矛盾了。

当时挺纠结的,因为只写过一道类型的题,还是用动规的写法写的,那个权值只有两个,也是pat的题,这个主要是权值矛盾了, 所以不能用动规的思想写。

#include <bits/stdc++.h>
using namespace std;
const int maxn=505;
const int INF=0x3f3f3f3f; int g[maxn][maxn];
vector<int> pre[maxn];
int C,N,M,SP;
int vis[maxn],num[maxn],d[maxn]; void dijkstra()
{
d[0]=0; for (int i=0;i<N;i++) {
int u=-1,tmp=INF;
for (int j=0;j<=N;j++) {
if (!vis[j]&&d[j]<tmp) {
tmp=d[j];
u=j;
}
}
if (u==-1) break;
vis[u]=1;
for (int j=0;j<=N;j++) {
if (j==u) {
continue;
}
if (d[u]+g[u][j]<d[j]) {
d[j]=d[u]+g[u][j];
pre[j].clear();
pre[j].push_back(u);
}
else if (d[u]+g[u][j]==d[j]) {
pre[j].push_back(u);
}
}
}
} int path[maxn],acnt=0;
int ansn=INF,anst=INF,ansp[maxn];
void dfs(int u,int need,int take,int cnt)
{
path[cnt]=u;
if (u==0) {
// for (int i=0;i<cnt;i++) {
// printf("%d ",path[i]);
// }
// puts("");
// printf("need %d take %d\n",need,take);
if (need<ansn) {
ansn=need;
anst=take;
acnt=cnt;
for (int i=0;i<cnt;i++) {
ansp[i]=path[i];
} }
else if (need==ansn) {
if (take<anst) {
anst=take;
acnt=cnt;
for (int i=0;i<cnt;i++) {
ansp[i]=path[i];
}
}
}
return ;
}
if (num[u]==C/2) {}
else if (num[u]>C/2) {
if (need>0) {
if (num[u]-C/2>=need) {
take+=num[u]-C/2-need;
need=0;
}
else need-=num[u]-C/2;
}
else take+=num[u]-C/2;
}
else need+=C/2-num[u]; int sz=pre[u].size();
for (int i=0;i<sz;i++) { dfs(pre[u][i],need,take,cnt+1);
}
} int main()
{
// freopen("in.txt","r",stdin);
scanf("%d%d%d%d",&C,&N,&SP,&M);
for (int i=1;i<=N;i++) {
scanf("%d",&num[i]);
} memset(g,INF,sizeof(g));
for (int i=0;i<=N;i++) {
g[i][i]=0;
d[i]=INF;
} int u,v,c;
for (int i=0;i<M;i++) {
scanf("%d%d%d",&u,&v,&c);
g[u][v]=c;
g[v][u]=c;
}
dijkstra();
// for (int i=1;i<=N;i++) {
// printf("%d ",d[i]);
// }
// puts("");
// for (int i=1;i<=N;i++) {
// printf("%d:\n",i);
// for (int j=0;j<pre[i].size();j++) {
// printf("%d ",pre[i][j]);
// }
// printf("\n");
// }
dfs(SP,0,0,0);
printf("%d %d",ansn,0);
for (int i=acnt-1;i>=0;i--) {
printf("->%d",ansp[i]);
}
printf(" %d\n",anst);
return 0;
}

1018 Public Bike Management (30分) (迪杰斯特拉+dfs)的更多相关文章

  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. 1018 Public Bike Management (30 分)

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

  3. 1018 Public Bike Management (30分) 思路分析 + 满分代码

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

  4. 1018 Public Bike Management (30分) PAT甲级真题 dijkstra + dfs

    前言: 本题是我在浏览了柳神的代码后,记下的一次半转载式笔记,不经感叹柳神的强大orz,这里给出柳神的题解地址:https://blog.csdn.net/liuchuo/article/detail ...

  5. 【PAT甲级】1018 Public Bike Management (30 分)(SPFA,DFS)

    题意: 输入四个正整数C,N,S,M(c<=100,n<=500),分别表示每个自行车站的最大容量,车站个数,此次行动的终点站以及接下来的M行输入即通路.接下来输入一行N个正整数表示每个自 ...

  6. 1018 Public Bike Management (30)(30 分)

    时间限制400 ms 内存限制65536 kB 代码长度限制16000 B There is a public bike service in Hangzhou City which provides ...

  7. 1018. Public Bike Management (30)

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

  8. 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 ...

  9. 1018 Public Bike Management (30) Dijkstra算法 + DFS

    题目及题解 https://blog.csdn.net/CV_Jason/article/details/81385228 迪杰斯特拉重新认识 两个核心的存储结构: int dis[n]: //记录每 ...

随机推荐

  1. 继 “多闪”后“飞聊”再被diss?其实社交还能这么玩

    近日头条低调上线了新的社交APP——飞聊,目前在AppStore社交排行榜第7位.但很多人使用了之后都觉得新产品的各个功能都让人想起其他的产品.兴趣小组让人想到豆瓣的兴趣小组,生活动态让人想到微博动态 ...

  2. os.getcwd()和os.path.realpath(__file__)的区别

    https://blog.csdn.net/xiaminli/article/details/74944580 python中split().os.path.split()函数用法

  3. Java必须知道的知识点

    junit用法,before,beforeClass,after, afterClass的执行顺序 分布式锁 nginx的请求转发算法,如何配置根据权重转发 用hashmap实现redis有什么问题( ...

  4. Redis Bitmap

    Redis提供对字符串的按位操作,位图把字符串抽象成一个bool类型的数组,可以进行按位操作 比如说我有一个字符串“a” 那他的位图如下 (位) 7 6 5 4 3 2 1 0 (值) ‭0 1 0 ...

  5. Android 验证APK签名对比

    最近OTT制定产品,其中有一条需求是只能安装自己公司签名的APK,所以在网上找了相关资料,最后总结功能实现如下: 1.签名错误码frameworks/base/core/java/android/co ...

  6. jquery使用ajax实现实时刷新,轮询

    来自:https://blog.csdn.net/qq_25406669/article/details/78343082 var isLoaded = false; function reqs() ...

  7. jdk8-》日期时间及其格式处理类特性

    一.JDK8之时间⽇期处理类 核⼼类: LocalDate:不包含具体时间的⽇期. LocalTime:不含⽇期的时间. LocalDateTime:包含了⽇期及时间. LocalDate 常⽤API ...

  8. AcWing 125. 耍杂技的牛

    //按照wi+si从小到大的顺序排,结果一定最优,最大的危险系数一定是最小的 //类比于国王游戏 #include <iostream> #include <algorithm> ...

  9. 路飞-celery框架

    Celery 官方 Celery 官网:http://www.celeryproject.org/ Celery 官方文档英文版:http://docs.celeryproject.org/en/la ...

  10. FastDFS :java.lang.Exception: getStoreStorage fail, errno code: 28

    FastDFS 服务正常,突然报错:java.lang.Exception: getStoreStorage fail, errno code: 28 答:错误代码28表示 No space left ...