博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 1860 Currency Exchange (SPFA、正权回路 bellman-ford)
阅读量:4400 次
发布时间:2019-06-07

本文共 2880 字,大约阅读时间需要 9 分钟。

题意:给定n中货币。以及它们之间的税率。A货币转化为B货币的公式为 B=(V-Cab)*Rab,当中V为A的货币量,

货币S通过若干此转换,再转换为原本的货币时是否会添加

分析:这个题就是推断是否存在正权回路。能够用bellman-ford算法,只是松弛条件相反

也能够用SPFA算法,推断经过转换后,转换为原本货币的值是否比原值大、、、

bellman-ford    0MS

#include
#include
struct stu{ int a,b; double r,c;}edge[205];double v,dis[105];int s;int bellmanford(int n,int m){ int i,j,flag=0; memset(dis,0,sizeof(dis)); dis[s]=v; for(i=1;i<=n-1;i++) for(j=1;j<=m;j++) if(dis[edge[j].a]&&(dis[edge[j].a]-edge[j].c)*edge[j].r>dis[edge[j].b]) dis[edge[j].b]=(dis[edge[j].a]-edge[j].c)*edge[j].r; for(j=1;j<=m;j++) if(dis[edge[j].a]&&(dis[edge[j].a]-edge[j].c)*edge[j].r>dis[edge[j].b]){ flag=1; break; } return flag;}int main(){ int i,j,l,r,n,m,flag; while(scanf("%d%d%d%lf",&n,&m,&s,&v)!=EOF){ j=1; for(i=1;i<=m;i++){ scanf("%d%d",&l,&r); scanf("%lf%lf",&edge[j].r,&edge[j].c); edge[j].a=l; edge[j].b=r; j++; edge[j].a=r; edge[j].b=l; scanf("%lf%lf",&edge[j].r,&edge[j].c); j++; } flag=bellmanford(n,2*m); if(flag) printf("YES\n"); else printf("NO\n"); } return 0;}
SPFA+邻接表  16MS

#include
#include
#include
using namespace std;struct stu{ int a,b; double r,c;}edge[205];double v,dis[105];int s,first[205],next[205],vis[105];int SPFA(int n,int m){ int i,pos; queue
q; memset(dis,0,sizeof(dis)); memset(vis,0,sizeof(vis)); dis[s]=v; q.push(s); vis[s]=1; while(!q.empty()){ pos=q.front(); q.pop(); vis[pos]=0; i=first[pos]; while(i!=-1){ if((dis[pos]-edge[i].c)*edge[i].r>dis[edge[i].b]){ dis[edge[i].b]=(dis[pos]-edge[i].c)*edge[i].r; if(!vis[edge[i].b]){ q.push(edge[i].b); vis[edge[i].b]=1; } } i=next[i]; } if(dis[s]>v) return 1; } return 0;}int main(){ int i,j,l,r,n,m,flag; while(scanf("%d%d%d%lf",&n,&m,&s,&v)!=EOF){ j=1; for(i=1;i<=m;i++){ scanf("%d%d",&l,&r); scanf("%lf%lf",&edge[j].r,&edge[j].c); edge[j].a=l; edge[j].b=r; j++; edge[j].a=r; edge[j].b=l; scanf("%lf%lf",&edge[j].r,&edge[j].c); j++; } memset(first,-1,sizeof(first)); for(i=1;i<=2*m;i++){ next[i]=first[edge[i].a]; first[edge[i].a]=i; } flag=SPFA(n,2*m); if(flag) printf("YES\n"); else printf("NO\n"); } return 0;}

转载于:https://www.cnblogs.com/zsychanpin/p/6971470.html

你可能感兴趣的文章
推荐一款扒站利器MAC版SiteSucker2.7.7
查看>>
SCCM 2012 R2 体验之旅-资产管理
查看>>
U盘启动安装Linux
查看>>
基于HttpWebRequest的通用请求和响应处理
查看>>
Tomcat 怎样防止跨站请求伪造(CSRF)
查看>>
Nginx域名访问处理过程
查看>>
centos按日期分割tomcat/logs/catalina.out文件
查看>>
关于TDD、BDD和DDD的一些看法
查看>>
mysql 创建用户时候报错 Unknown column 'plugin' in 'mysql.user'
查看>>
10.4通过生成器yield实现伪并发
查看>>
C#下用P2P技术实现点对点聊天
查看>>
【干货】一篇文章让你了解大数据挖掘技术
查看>>
【安全牛学习笔记】XSS-简介、跨站脚本检测和常见的***利用手段2
查看>>
yum源的配置方法
查看>>
springboot整合vue小试牛刀
查看>>
MySQL参数优化测试建议
查看>>
组策略部署软件之三:发布非MSI程序包-制作和部署ZAP包
查看>>
整理Java基础知识--修饰符
查看>>
MySQL高可用之MHA
查看>>
使用java代码提交Spark的hive sql任务,run as java application
查看>>