洛谷P1576||最小花费||dijkstra||双向建边!!
题目描述
在n个人中,某些人的银行账号之间可以互相转账。这些人之间转账的手续费各不相同。给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元。
数据范围
1<=n<=2000,m<=100000
思路分析
可以把每个人看成是一个点,那么题目描述的问题就是使得A->B的花费最少,即两点间的最短路问题,这里我们采用dijkstra算法。
由于m<=100000,故我们采用链式前向星进行存储图,每次找到一个距离原点最近并且没有被访问过的点后,遍历连接此点的每一条边,更新其连接节点的花费
代码(我把dijkstra分为两部分,这样虽然效率低,但是对于我来说思路更清晰些)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#define N 300010
#define MAXX 1e7+10
#define MINN -1e7+10
using namespace std; struct road
{
int starts,ends,vals;
}ro[N];
double firsts[N],NEXT[N];
int len=;
int n,m,A,B;
double dis[N];
double inputnum[N][];
void insert(int xx,int yy,int zz)
{
len++;
ro[len].starts=xx;ro[len].ends=yy;ro[len].vals=zz;
NEXT[len]=firsts[xx];firsts[xx]=len;
} void init()
{
cin>>n>>m;
for(int i=;i<=m;i++)
{
int aa,bb,cc;
cin>>aa>>bb>>cc;
insert(aa,bb,cc);
insert(bb,aa,cc);
}
cin>>A>>B;
}
bool flag[N];
inline void pre(){ for(int i=;i<=n;i++) dis[i]=MAXX;}
inline void dijkstra1(int st,double vv)//单源点dijkstra
{ for(int i=firsts[st];i;i=NEXT[i]) //如果出度的权值小于当前dis数组的权值,那么就更新dis数组
{
if(dis[st]/(-ro[i].vals*0.01)<dis[ro[i].ends])
{
dis[ro[i].ends]=dis[st]/(-ro[i].vals*0.01);
}
} } void dijkstra()
{
pre();
dis[A]=;
for(int i=firsts[A];i;i=NEXT[i])
{
dis[ro[i].ends]=dis[A]/(-ro[i].vals*0.01);
}
// for(int i=1;i<=n;i++) //cout<<i<<' '<<dis[i]<<' '; //cout<<endl;
for(int j=;j<=n;j++){
double minn=;int temp;
for(int i=;i<=n;i++){
if(i==A) continue;
if(flag[i]==) continue;
if(dis[i]<minn)
{
temp=i;minn=dis[i];
////cout<<dis[i]<<' '<<minn<<endl;
}
}
flag[temp]=;
dijkstra1(temp,minn); }
} void debug_output()
{
for(int i=;i<=len;i++)
cout<<ro[i].starts<<' '<<ro[i].ends<<' '<<ro[i].vals<<' '<<NEXT[i]<<' '<<firsts[ro[i].starts]<<endl; }
int main()
{
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
init();
//debug_output();
dijkstra();
cout<<fixed<<setprecision();
// for(int i=1;i<=n;i++)
cout<<dis[B]<<endl;
return ;
}
洛谷P1576||最小花费||dijkstra||双向建边!!的更多相关文章
- 洛谷—— P1576 最小花费
P1576 最小花费 题目背景 题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使 ...
- 洛谷 P1576 最小花费
题目戳 题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元. ...
- 洛谷P1576 最小花费x
题目背景 题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元 ...
- 浅谈SPFA——洛谷P1576 最小花费 题解
想找原题请点击这里:传送门 原题: 题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少 ...
- 洛谷 P1756 最小花费
题目背景 题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元 ...
- 1344:【例4-4】最小花费 dijkstra
1344:[例4-4]最小花费 Dijkstra (1)a [ i ] [ j ] 存转账率(..转后所得率..) (2)dis [ i ] 也就是 a [ 起点 ] [ i ] (3)f [ i ] ...
- 洛谷4951 地震 bzoj1816扑克牌 洛谷3199最小圈 / 01分数规划
洛谷4951 地震 #include<iostream> #include<cstdio> #include<algorithm> #define go(i,a,b ...
- Bzoj1486/洛谷P3199 最小圈(0/1分数规划+spfa)/(动态规划+结论)
题面 Bzoj 洛谷 题解(0/1分数规划+spfa) 考虑\(0/1\)分数规划,设当前枚举到的答案为\(ans\) 则我们要使(其中\(\forall b_i=1\)) \[ \frac{\sum ...
- 网络流24题 第三题 - CodeVS1904 洛谷2764 最小路径覆盖问题 有向无环图最小路径覆盖 最大流 二分图匹配 匈牙利算法
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - CodeVS1904 题目传送门 - 洛谷2764 题意概括 给出一个有向无环图,现在请你求一些路径,这些路径 ...
随机推荐
- 二、Python-运算符、控制及循环语句
一.运算符 算数运算符 +:加 -:减 *:乘 /:除 ~:取反 %:求余数(只返回余数) //:取整数(只返回整数部分) **:幂,返回x的y次方 赋值运算符:= 比较运算符:<小于.< ...
- zk开机自动启动脚本
[Unit] Description=Zookeeper service After=network.target [Service] User=www Group=www SyslogIdentif ...
- 《python编程快速上手》
第一部分 编程基础 @表达式 ** % // @ >>> int(3.4) 3 >>>round(3.555,2)3.56 @判断条件时:0和0.0和‘’都是Fal ...
- Django自定义模板标签和过滤器
1.创建模板库 在某个APP所在目录下新建包templatetags,然后在其中创建存储标签或者过滤器的的模块,名称随意,例如myfilters.py. 在这个模块中编写相关代码. 注意:templa ...
- c语言中的利用函数实现交换两个字符,交换两个字符串
c语言交换两个字符: 方法一:利用指针传址,效率比较高 void swap(int *a,int *b) { int temp; temp = *a; *a = *b; *b = temp } 方法二 ...
- DRF框架之视图方法的几个封装好的模块介绍(第三天)
1.DRF框架给我们封装好了好多层模块的 来实现简便接口的编写 # from rest_framework.mixins import CreateModelMixin, UpdateModelMix ...
- PowerDesigner工具将表字段转成java实体
首先将数据库的表导出为SQL文件.下载安装PowerDesigner工具. 下面以图文的形式讲解: 图 (1) 图 (2) 图 (3) 图 (4) 图 (5) 图 (6) 图 ...
- Spring.xml中配置注解context:annotation-config和context:component-scan简述
XML中context:annotation-config和context:component-scan简述 <context:annotation-config/> 中文意思:<上 ...
- ThinkPHP 整合微信支付 扫码支付 模式二 图文教程
这篇文章主要介绍扫码支付场景二. 目前有两种模式,模式一比模式二稍微复杂点,至于模式一与模式二的具体内容,流程,微信开发文档都有详细介绍,这里就不多说废话,接下来赶紧上教程! [title]下载SDK ...
- 解决PLSQL Developer 插入中文 乱码问题
https://blog.csdn.net/guowd/article/details/50989109 PLSQL Developer 插入中文 乱码问题,如图 这个是由于oracle服务器端字符编 ...