设为首页 收藏本站
查看: 630|回复: 0

[经验分享] poj1860(Currency Exchange)

[复制链接]
累计签到:12 天
连续签到:1 天
发表于 2015-9-11 12:04:55 | 显示全部楼层 |阅读模式
  题目大意:
  给你几个国家的货币兑换率,看你是否能通过不同国家的货币兑换之后是自己的财富增加,如增加输出YES,无法增加输出NO。
  具体兑换过程:
  N代表几个国家,M代表几条兑换的信息,S代表起始的国家,V代表你现有的财富金额。
  从A兑换到B 得到的财富 :(V-Cab)*Rab 、
  测试数据:1 2 1.00 1.00 1.00 1.00 1.00 。代表1-2兑换的Rab、Cab是1.00 1.00.  2-1的兑换的Rab和Cab是后两位浮点数1.00 1.00。
  
  解题思路:
  通过Bellman_ford 看是否有正权回路,如果有正权回路,说明财富持续增加输出YES,否则输出NO。
  
  代码:


DSC0000.gif DSC0001.gif


  1 #include <algorithm>
  2 #include <iostream>
  3 #include <sstream>
  4 #include <cstdlib>
  5 #include <cstring>
  6 #include <cstdio>
  7 #include <string>
  8 #include <bitset>
  9 #include <vector>
10 #include <queue>
11 #include <stack>
12 #include <cmath>
13 #include <list>
14 #include <map>
15 #include <set>
16 using namespace std;
17 /***************************************/
18 #define ll long long
19 #define int64 __int64
20 /***************************************/
21 const int INF = 0x7f7f7f7f;
22 const double eps = 1e-8;
23 const double PIE=acos(-1.0);
24 const int d1x[]= {0,-1,0,1};
25 const int d1y[]= {-1,0,1,0};
26 const int d2x[]= {0,-1,0,1};
27 const int d2y[]= {1,0,-1,0};
28 const int fx[]= {-1,-1,-1,0,0,1,1,1};
29 const int fy[]= {-1,0,1,-1,1,-1,0,1};
30 /***************************************/
31 void openfile()
32 {
33     freopen("data.in","rb",stdin);
34     freopen("data.out","wb",stdout);
35 }
36 /**********************华丽丽的分割线,以上为模板部分*****************/
37 #define MAX 0
38 #define N 9010
39 int nodenum, edgenum, w; //点,边,起点
40 typedef struct Edge //边
41 {
42     int u, v;
43     double c,r;
44 } Edge;
45 Edge edge[N];
46 double dis[N];
47 int d;
48 bool Bellman_Ford(int s,double w)
49 {
50     for(int i = 1; i <= nodenum; ++i) //初始化
51         dis=MAX;
52     dis=w;
53     for(int i = 1; i <= nodenum-1; ++i)
54         for(int j=1; j<=d-1; ++j)
55             if(dis[edge[j].u]>0&&dis[edge[j].v]<(dis[edge[j].u]-edge[j].c)*edge[j].r) //松弛(顺序一定不能反~)
56                 dis[edge[j].v] =(dis[edge[j].u]-edge[j].c)*edge[j].r;
57     bool flag = 0;//判断是否含有正权回路
58     for(int j = 1; j <=d-1; ++j)
59        if(dis[edge[j].u]>0&&dis[edge[j].v]<(dis[edge[j].u]-edge[j].c)*edge[j].r)
60         {
61             flag = 1;
62             break;
63         }
64     return flag;
65 }
66 /*
67 上边是正常的判断回路,通过至少边数N-1的循环之后,再判断下各点是否能够更新dis数组,如果更新说明出现回路。
68 然而这题可以通过下面的方法做,原因是给你N条边但是实际记录的2*N条边,所以第一个for循环循环到2*N-1可以得出正确结果,
69 因为超过了N-1次循环,所以足可以判断是否有正权回路,下面的bellman_ford函数的flag是判断如果后面的循环中有任意一次没
70 进入if说明不存在正权回路,因为如果是正权回路,每一次必然会进入if。
71 bool Bellman_Ford(int s,double w)
72 {
73     for(int i = 1; i <= nodenum; ++i) //初始化
74         dis=MAX;
75     dis=w;
76     bool flag;
77     for(int i = 1; i <= nodenum-1; ++i)
78     {
79         flag=true;
80         for(int j=1; j<=d-1; ++j)
81             if(dis[edge[j].u]>0&&dis[edge[j].v]<(dis[edge[j].u]-edge[j].c)*edge[j].r) //松弛(顺序一定不能反~)
82             {
83                 flag=false;
84                 dis[edge[j].v] =(dis[edge[j].u]-edge[j].c)*edge[j].r;
85             }
86         if (flag)
87             return false;
88     }
89     return true;
90 }
91 */
92 int main()
93 {
94     int u,v;
95     double c,r;
96     int s;
97     double w;
98     while(scanf("%d%d%d%lf", &nodenum, &edgenum,&s,&w)!=EOF)
99     {
100         d=1;
101         for(int i = 1; i <= edgenum; ++i)
102         {
103             scanf("%d%d%lf%lf",&u,&v,&r,&c);
104             edge[d].u=u;
105             edge[d].v=v;
106             edge[d].c=c;
107             edge[d].r=r;
108             d++;
109             scanf("%lf%lf",&r,&c);
110             edge[d].u=v;
111             edge[d].v=u;
112             edge[d].c=c;
113             edge[d].r=r;
114             d++;
115         }
116         if(Bellman_Ford(s,w))
117             printf("YES\n");
118         else
119             printf("NO\n");
120     }
121     return 0;
122 }
View Code  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-112303-1-1.html 上篇帖子: Exchange 2007 error: MSExchangeSA 9317 下篇帖子: 动态数据交换(DDE, Dynamic Data Exchange)简介
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表