洛谷-1576 最小花费

思路

dij算法

代码

#include<cstdio>
#include<cstring>
#include<cmath>
#define INF 1e30
#define r(i,a,b) for (int i=a;i<=b;i++)
using namespace std;int n,c,d,now,m,ans=0,p;
double l[2001][2001]={0},minn;
int x,y;
double f[2001]={0};bool v[2001];
double min(double x,double y){return x<y?x:y;}
double max(double x,double y){return x>y?x:y;}
void read(int &f)//输入流
{
    f=0;char c;bool d=0;
    while (c=getchar(),c<'0'||c>'9') if (c=='-') d=1;f=f*10+c-48;
    while (c=getchar(),c>='0'&&c<='9') f=f*10+c-48;
    if (d) f*=-1;
}
void LRZ()
{
    read(n);read(m);
    r(i,1,m)
      {
      	 read(x);read(y);
      	 scanf("%lf",&l[x][y]);
      	 l[y][x]=l[x][y]=(100-l[x][y])/100;//双向汇款
      }read(c);read(d);//第c个人转给第d个人
}
void work()
{
    r(i,1,n)
     f[i]=l[c][i];v[c]=true;f[c]=1;//舒适化
    r(i,1,n-1)
     {
     	minn=0;
     	r(j,1,n)
     	 if (!v[j]&&f[j]>minn) p=j,minn=f[j];//找到最小值
     	v[p]=true;//标记
        if(p==d) break;//如果已经汇到了,直接退出
     	r(j,1,n)
     	 if (!v[j]&&l[p][j]*f[p]>f[j])f[j]=l[p][j]*f[p];//修正
     }
}
void print()
{
    printf("%0.8lf",100/f[d]);//输出
}
int main()
{
    LRZ();
    work();
    print();
}



### Dijkstra算法在洛谷平台的应用 #### 关于玛丽卡问题中的Dijkstra算法应用 对于特定场景下的最短路径计算,如玛丽卡问题中提到的情况,在每次迭代过程中将之前找到的最短路径上的某一条边设置为极大值(例如`1e9`),以此模拟该路段堵塞无法通行的状态,之后再次执行Dijkstra算法来寻找新的最短路径[^1]。 ```python import heapq def dijkstra(graph, start): queue = [] distances = {node: float('inf') for node in graph} distances[start] = 0 heapq.heappush(queue, (distances[start], start)) while queue: current_distance, current_node = heapq.heappop(queue) if current_distance > distances[current_node]: continue for neighbor, weight in graph[current_node].items(): distance = current_distance + weight if distance < distances[neighbor]: distances[neighbor] = distance heapq.heappush(queue, (distance, neighbor)) return distances ``` 此代码片段展示了如何实现基本形式的Dijkstra算法用于解决单源最短路径问题。然而针对具体题目需求可能还需要额外处理逻辑,比如上述提及到的修改已知最优解路径上的权重操作。 #### 转账手续费最小化问题 另一个例子是在P1576最小花费一题里,通过构建加权图模型表示不同个体间转账所需支付的成本百分比,并利用Dijkstra算法找出从起点至终点成本最低的传输路线[^2]。 为了帮助更好地理解和掌握这类基于图论优化的问题解决方案,建议访问洛谷官方网站查阅更多关于Dijkstra算法的实际案例以及官方提供的教学资源链接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值