5 条题解
-
1
题目理解:
题目给出每两个人之间的转账路径和手续费,要求从a转账给b100元最小需要花都少元
换而言之,就是求a,b之间的最短路径,初步考虑dijkstra(迪杰斯特拉)或DFS(深度优先搜索)
注意到题目中n<=2000,尝试使用DFS暴力搜索出答案
代码构建:
首先将n,m输入进来,然后用邻接表存储两点之间的权值(即手续费),最后输入a,b
接下来用DFS搜索,先从a出发,从邻接表中搜索路径,用now保存当前手续费,在每次路径选择中更新now,当此路径通往的终点未被标记(即未遍历过),且存在路径时继续搜索,当现在处于的点为b时停止搜索并更新答案即可
问题分析:
有没有可能这样交上去的代码会有问题呢(时间复杂度不计)?当然有,注意到如果有一条路径为a,b,0时,答案的值为0,且答案的初始化结果为0,这会导致100/ans的值无法计算,从而使输出为inf,runtime error
对此进行优化,在输出时用三目运算符暴力解决ans=0的情况即可
最终代码:
发现所有测试点在4ms以内成功通过,趁题目数据这么水,赶紧提交啊!!!#include<bits/stdc++.h> using namespace std; int n,m,a,b,mapp[2005][2005],vis[2005]; double ans; void dfs(int start,double now){ if(start==b){ if(now>ans)ans=now; return; } for(int i=1;i<=n;i++){ if(vis[i]==0&&mapp[start][i]){ vis[i]=1; dfs(i,now*(100-mapp[start][i])*0.01); vis[i]=0; } } return; } int main(){ cin>>n>>m; for(int i=1;i<=m;i++){ int x,y,z;cin>>x>>y>>z; mapp[x][y]=z;mapp[y][x]=z; } cin>>a>>b; dfs(a,1); printf("%.8f",((ans==0)?(100):(100*1.0/ans))); return 0; }
信息
- ID
- 2750
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 52
- 已通过
- 23
- 上传者