【题目描述】:

给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。

【输入描述】:

多组数据:每组数据描述如下:

输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。

n和m为0时输入结束。

【输出描述】:

输出一行有两个数, 最短距离及其花费。

【样例输入】:

3 2
1 2 5 6
2 3 4 5
1 3
0 0

【样例输出】:

9 11

【时间限制、数据范围及描述】:

时间:1s 空间:128M

对于 30%的数据:1<n<=100

对于100%的数据:1<n<=1000; 0<m<100000; s != t; 1<=d,p<=1000

数据组数<=5,注意卡常;

题解:spfa,哇为什么就是过不了样例呢,找不出错误,难受.jpg

错解:

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
typedef long long ll;
using namespace std;
const int oo=21474836;
int n,m,k,cnt,x,y,z,dis[100005],vis[100005];
struct node{int to;int val;int next;int cos;
}e[100005];
int head[100004];
int coo[100004],hh;
void add(int a,int b,int c,int d){cnt++;e[cnt].to=b;e[cnt].val=c;e[cnt].cos=d;e[cnt].next=head[a];head[a]=cnt;
}
int main(){freopen("216.in","r",stdin);freopen("216.out","w",stdout);while(1){scanf("%d %d",&n,&m);queue<int>q; cnt=0;if(n==0 && m==0) break; for(int i=1;i<=m;i++){scanf("%d %d %d %d",&hh,&x,&y,&z);add(hh,x,y,z);add(x,hh,y,z);}memset(head,0,sizeof(head));memset(e,0,sizeof(e));memset(dis,0x3f,sizeof(dis));memset(coo,0x3f,sizeof(coo));memset(vis,0,sizeof(vis));int s,t;scanf("%d %d",&s,&t);q.push(s);dis[s]=0;coo[s]=0;vis[s]=1;while(!q.empty()){x=q.front();q.pop();vis[x]=0;for(int i=head[x];i!=0;i=e[i].next){int too=e[i].to;if(dis[too]>dis[x]+e[i].val){ dis[too]=dis[x]+e[i].val;coo[too]=coo[x]+e[i].cos; if(vis[too]==0) { vis[too]=1; q.push(too); }} if(dis[too]==dis[x]+e[i].val && coo[x]+e[i].cos<coo[too]){ dis[too]=dis[x]+e[i].val;coo[too]=coo[x]+e[i].cos; if(vis[too]==0) { vis[too]=1; q.push(too); }} }}printf("%d %d\n",dis[t],coo[t]);}return 0;
}

感谢srj大佬给予修改找bug!!!orzTQL

#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
typedef long long ll;
using namespace std;
const int oo=21474836;
int n,m,k,cnt,x,y,z,dis[1000005];//,vis[100005];
struct node{int to;int val;int next;int cos;
}e[1000005];
int head[1000005];
int coo[1000005],hh;
struct Node{int pos,dis,cos;bool operator < ( const Node &a )const{return a.dis==dis?a.cos<cos:a.dis<dis;}
};
priority_queue<Node>q;
void add(int a,int b,int c,int d){cnt++;e[cnt].to=b;e[cnt].val=c;e[cnt].cos=d;e[cnt].next=head[a];head[a]=cnt;
}
int main(){freopen("216.in","r",stdin);freopen("216.out","w",stdout);while(1){scanf("%d%d",&n,&m);cnt=0;if(n==0 && m==0) break; memset(head,0,sizeof(head));memset(e,0,sizeof(e));memset(dis,0x3f,sizeof(dis));memset(coo,0x3f,sizeof(coo));for(int i=1;i<=m;i++){scanf("%d%d%d%d",&x,&hh,&y,&z);add(hh,x,y,z);add(x,hh,y,z);}int s,t;scanf("%d%d",&s,&t);q.push((Node){s,0,0});dis[s]=0;coo[s]=0;while(!q.empty()){Node tmp=q.top();q.pop();int x=tmp.pos;for(int i=head[x];i!=0;i=e[i].next){int too=e[i].to;if(dis[too]>dis[x]+e[i].val){ dis[too]=dis[x]+e[i].val;coo[too]=coo[x]+e[i].cos;q.push((Node){too,dis[too],coo[too]});} else if(dis[too]==dis[x]+e[i].val && coo[x]+e[i].cos<coo[too]){ dis[too]=dis[x]+e[i].val;coo[too]=coo[x]+e[i].cos;q.push((Node){too,dis[too],coo[too]});} }}printf("%d %d\n",dis[t],coo[t]);}return 0;
}

转载于:https://www.cnblogs.com/wuhu-JJJ/p/11140967.html

【UOJ 216】最小花费最短路相关推荐

  1. #216. 最小花费最短路

    好像不早了啊这个时间...唉反正没事干,还要跟人聊天,正好还欠那么多,能写一些就写一些吧嘤嘤嘤 究极题面魔法术lalala(傻子博主) 这题呢,基本上就是一个裸的最短路,虽然老师让我们用dijkstr ...

  2. 【最短路】【Dijkstra】【图论】最小花费(jzoj 2125)

    最小花费 题目大意: n个人,一些人之间可以相互转账,但又手续费x%,问A转给B100元至少要多少钱 样例输入 3 3 1 2 1 2 3 2 1 3 3 1 3 样例输出 103.07153164 ...

  3. 【图论】【最短路】【Dijkstra】最小花费(ssl 2206/luogu 1576)

    最小花费 ssl 2206 luogu 1576 题目大意: 有n个人,他们之间有m对人可以相互{\color{red}相互}相互转账,但要收一定的税,求第x个人转给第y个人至少要多少钱 Descri ...

  4. ZOJ3715 竞选班长求最小花费

    题意:       有n个小朋友竞选班长,一号想当班长,每个人都必须选择一个人当班长,并且不可以选择自己,并且每个人都有一个权值ai,这个权值就是如果1想让这个人改变主意选择自己当班长就得给他ai个糖 ...

  5. SPFA 跑得快,跑得快。最小花费问题

    1443: 最小花费 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100 ...

  6. hdu4122 制作月饼完成订单的最小花费

    题意:       有一个加工厂加工月饼的,这个工厂一共开业m小时,2000年1月1日0点是开业的第一个小时,每个小时加工月饼的价钱也不一样,然后每个月饼的保质期都是t天,因为要放在冰箱里保存,所以在 ...

  7. LeetCode-动态规划基础题-746. 使用最小花费爬楼梯

    描述 746.使用最小花费爬楼梯 数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始). 每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应 ...

  8. 1230: 最小花费(spfa)

    1230: 最小花费 时间限制: 1 Sec 内存限制: 128 MB 题目描述 在n个人中,某些人的银行账号之间可以互相转账.这些人之间转账的手续费各不相同.给定这些人之间转账时需要从转账金额里扣除 ...

  9. LeetCode Algorithm 746. 使用最小花费爬楼梯

    746. 使用最小花费爬楼梯 Ideas 首先确定题目类型,爬楼梯问题,并且给定了状态转移的限制,其实就已经可以确定状态转移方程了. 然后题目说可以从下标为0或下标为1的台阶开始爬,所以我们可以定义两 ...

最新文章

  1. 【Groovy】集合遍历 ( 使用集合的 find 方法查找集合元素 | 闭包中使用 == 作为查找匹配条件 | 闭包中使用 is 作为查找匹配条件 | 闭包使用 true 作为条件 | 代码示例 )
  2. Linux下Nginx编译安装后的开机自启动设置
  3. ORACLE修改表空间方法
  4. 游戏中的颜色:深度解析游戏设计工具
  5. php中等腰金字塔挖空,php 用for循環做,金字塔,菱形,空三角
  6. 常见 Java 字节码 指令 助记符
  7. 解密Oracle备份工具-exp/imp
  8. Mina Protocol将主网候选版本发布时间延后一小时至3月17日8点
  9. Oracle的执行计划详解
  10. android分享,如何移除掉信息这项
  11. 博客园设置访问统计功能-by beanmoon
  12. 苹果支付2500万美元和解专利侵权诉讼 获技术授权
  13. linux进程作业号,Linux系统进程管理及作业操作
  14. HTK中函数ProcessCrossWordLinks处理流程
  15. 软件工程 网络工程,职业方向是怎样的?选择之前一定要了解!
  16. VS2017离线安装
  17. 贪心算法之田忌赛马问题
  18. sci审稿意见_SCI审稿人的意见很多,要全盘接受吗?
  19. MsCOCO数据集标注详解
  20. linux查看当前运行的进程

热门文章

  1. FinTech创业的两大势力,以及他们各有千秋的数据应用模式 | TCFA纽约年会直击
  2. bnu 33970 Ears Cutting
  3. 苹果(maccms V10) Python 采集豆瓣评分直接入库。
  4. python 解方程 sympy_SymPy解方程的实现
  5. 对话雪球创始人方三文:「打工人」如何选行业、找工作、挑老板?|创新大会 2021...
  6. 【Python爬虫系列】浅尝一下爬虫40例实战教程+源代码【基础+进阶】
  7. 腾讯光子游戏客户端开发公开课以及实习生面试凉经
  8. 教你怎样任意转换视频格式
  9. 推荐算法之逻辑回归模型族
  10. 苹果台式机怎么设置我的电脑计算机,苹果电脑一体机怎么开机_苹果台式一体机开机在哪-win7之家...