5 条题解

  • 1
    @ 2025-6-14 18:16:21

    题目理解:
    题目给出每两个人之间的转账路径和手续费,要求从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
    上传者