poj1680 最短路判环

题意:有多个银行可以换钱,每个银行可以将特定的两种钱相互兑换,并且有自己的汇率,现在问是否可以将自己的钱通过银行兑换增加。

其实比较水,主要就是知道最短路问题里的负环可以通过bellman-fold或spfa判断出来,在这里其实就是找正的环就行了。

一开始WA了无数发……原因是传参传了int,但其实是double……

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<queue>
 4 using namespace std;
 5
 6 int head[1005],point[2005],next[2005],size,t[2005],n,m;
 7 double r[2005],c[2005],dist[1005];
 8 bool vis[1005];
 9
10 void add(int a,int b,double r1,double c1){
11     point[size]=b;
12     r[size]=r1;
13     c[size]=c1;
14     next[size]=head[a];
15     head[a]=size++;
16 }
17
18 void spfa(int s,double v){
19     int i;
20     memset(dist,0,sizeof(dist));
21     memset(vis,0,sizeof(vis));
22     memset(t,0,sizeof(t));
23     dist[s]=v;
24     queue<int>q;
25     q.push(s);
26     vis[s]=1;
27     bool f=0;
28     while(!q.empty()){
29         if(f)break;
30         int u=q.front();
31         q.pop();
32         vis[u]=0;
33         for(i=head[u];~i;i=next[i]){
34             int j=point[i];
35             if(dist[j]<(dist[u]-c[i])*r[i]){
36                 dist[j]=(dist[u]-c[i])*r[i];
37                 if(!vis[j]){
38                     q.push(j);
39                     vis[j]=1;
40                     t[j]++;
41                     if(t[j]>n)f=1;
42                 }
43             }
44         }
45     }
46     if(f)printf("YES\n");
47     else printf("NO\n");
48 }
49
50 int main(){
51     int s,i;
52     double v;
53     while(scanf("%d%d%d%lf",&n,&m,&s,&v)!=EOF){
54         memset(head,-1,sizeof(head));
55         size=0;
56         for(i=1;i<=m;i++){
57             int a,b;
58             double r1,c1;
59             scanf("%d%d%lf%lf",&a,&b,&r1,&c1);
60             add(a,b,r1,c1);
61             scanf("%lf%lf",&r1,&c1);
62             add(b,a,r1,c1);
63         }
64         spfa(s,v);
65     }
66     return 0;
67 }

时间: 2024-10-10 05:06:20

poj1680 最短路判环的相关文章

poj2240 最短路判环

题意:与poj1680一样,有不同的换钱渠道,可以完成特定两种货币的交换,并且有汇率,只不过此题是单向边,然后问是否能使财富增加 与poj1680一样,建图之后直接spfa判增值的环即可 1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<queue> 6 #include<map> 7 #include&l

poj3259 最短路判环

题意:有一些点.一些道路和一些虫洞,道路是双向的,连接两点,花费正的时间,而虫洞是单向的,连接两点,可以使时间倒退,求是否能够回到过去. 只要明确回到过去其实就是当出现一个负环的时候,不断沿这个环走,就能够实现时间倒退了. 然后就是判负环…… spfa版: 1 #include<stdio.h> 2 #include<string.h> 3 #include<queue> 4 using namespace std; 5 6 int head[505],next[600

HDU - 2647 Reward (最短路 判环)

题目大意:有一家公司,要发奖金了.因为勤劳度不同的缘故,所以奖金不能人人都相同,问如何发奖金才能使得人人都满意,且所花费的总金额达到最小 解题思路:我将攀比关系当成了有向边,并赋为-1,如果出现负环的话,表示怎样都不可能满足的 总金额达到最小,那只要比攀比的人多1就好了,这就是赋值为-1的缘故,接着SPFA,求出来,转为正值即可 #include <cstdio> #include <cstring> #include <queue> using namespace s

NYOJ 973 天下第一(最长路判环)

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=973 题目大意:给你n种武功,每两种武功都可以相互转化,但是有转化率f, 每次必须从一开始转化, 中间有武功转化不了, 后面的就不能在转化了, 问你能否可以无限增加转化. 在做这道题以前做了和这道题一样的一道题, 所以我认为很快就能AC了, 但是这道题我还是弄了一天还是没能AC.来讲一下让我很是郁闷的问题吧. 这道题可以用最短路判环(spfa只需稍微变一下)来做,也可以用直接深搜来做.我

hdu 1625 Numbering Paths 最短路的变形,使用Floyd 外加判环

Numbering Paths Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 158    Accepted Submission(s): 47 Problem Description Problems that process input and generate a simple ``yes'' or ``no'' answer

【BZOJ 3232】圈地游戏 二分+SPFA判环/最小割经典模型

最小割经典模型指的是“一堆元素进行选取,对于某个元素的取舍有代价或价值,对于某些对元素,选取后会有额外代价或价值”的经典最小割模型,建立倒三角进行最小割.这个二分是显然的,一开始我也是想到了最小割的那个模型的但是我觉得他会不是一个圈我就否掉了,但是仔细想想的话会发现,如果是这样的话所得到的答案一定小于等于一个圈的答案(浓度),所以我们可定会得到最终答案,所以这样做是可以的,所以说要有宽松得正解的意识(泥沙俱下但沙子不影响我泥).当时我否掉最小割以后就立马去想费用流了,然后想到建图后发现那样建图虽

HDU 5154 Harry and Magical Computer 有向图判环

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5154 题解: 有向图判环. 1.用dfs,正在访问的节点标记为-1,已经访问过的节点标记为1,没有访问过的节点标记为0,如果访问到-1的节点说明说有环. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 t

HDOJ 5154 Harry and Magical Computer floyd判环

floyd判环 Harry and Magical Computer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1005    Accepted Submission(s): 404 Problem Description In reward of being yearly outstanding magic student, H

POJ 2240 Arbitrage (spfa判环)

Arbitrage Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currency. For example, suppose that 1 US Dollar buys 0.5 British pound, 1 British pound buys 10.0 Frenc