一个关于套利的题,就是判断是否有正环,我这里是用的SPFA,只要判断出来一种货币初始为1,最后变得大于1就代表是正环,要注意一下最后对vector的清空,当时从1开始清空,导致wa了两次,找了半天,尽量不要出现小的错误还是很致命的

#include <iostream>
#include<string.h>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
#define MAX 99999999;
double dis[+];
double vis[+];
int time[+];
int n;
char name[][];
double fir;
typedef struct
{
int x;
double rate;
//double cost;
}point;
int judge_name( char* str)
{
for(int i=;i<n;i++)
{
if(strcmp(str,name[i])==)
return i;
}
}
vector<point> p[];
int Spfa(int start)
{
queue<int> Q;
memset(time,,sizeof(time));
memset(vis, , sizeof(vis));
memset(dis, , sizeof(dis));
dis[start] = 1.0;
vis[start] = true;
time[start]++;
Q.push(start);
while (!Q.empty()){
int temp = Q.front();
Q.pop();
vis[temp] = false;
for(int i=; i<p[temp].size(); i++)
{
int v=p[temp][i].x;
double w=p[temp][i].rate; if (dis[v] <dis[temp]*w)
{
dis[v] = dis[temp]*w;
if(dis[start]>1.0)
{
// cout<<start<<endl;
// cout<<dis[start]<<endl;;
return true;
}
if (!vis[v])
{
Q.push(v);
vis[v] = true;
}
}
}
}
return false;
}
int main()
{
int m,s;
int total=;
while(cin>>n,n)
{
for(int i=;i<n;i++)
cin>>name[i];
int m;
cin>>m;
char str1[],str2[];
double f;
point node;
for(int i=;i<m;i++)
{
cin>>str1>>f>>str2;
node.x=judge_name(str2);
node.rate=f;
p[judge_name(str1)].push_back(node);
}
int flag=;
for(int i=;i<n;i++)
{
if(Spfa(i))
{
flag=true;
break;
}
}
if(flag)
printf("Case %d: Yes\n",++total);
else
printf("Case %d: No\n",++total);
for(int i=;i<n;i++)
p[i].clear();
}
return ;
}

poj2240的更多相关文章

  1. POJ-2240 Arbitrage---判断正环+枚举

    题目链接: https://vjudge.net/problem/POJ-2240 题目大意: 已知n种货币,以及m种货币汇率及方式,问能否通过货币转换,使得财富增加. 思路: 由于这里问的是财富有没 ...

  2. POJ-2240 Arbitrage BellmanFord查可循环圈

    题目链接:https://cn.vjudge.net/problem/POJ-2240 题意 套利(Arbitrage)就是通过不断兑换外币,使得自己钱变多的行为 给出一些汇率 问能不能套利 思路 马 ...

  3. 用SPFA 解决POJ2240

    Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 30790   Accepted: 12761 Descr ...

  4. POJ-2240(floyd算法简单应用)

    Arbitrage poj-2240 #include<iostream> #include<cstdio> #include<cstring> #include& ...

  5. poj2240 floyd

    //Accepted 732 KB 782 ms //floyd应用 #include <cstdio> #include <cstring> #include <ios ...

  6. poj2240最短路 floyd

    Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17360   Accepted: 7308 Descri ...

  7. POJ2240 Arbitrage(Floyd判负环)

    跑完Floyd后,d[u][u]就表示从u点出发可以经过所有n个点回到u点的最短路,因此只要根据数组对角线的信息就能判断是否存在负环. #include<cstdio> #include& ...

  8. poj-------(2240)Arbitrage(最短路)

    Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15640   Accepted: 6563 Descri ...

  9. poj2240 最短路判环

    题意:与poj1680一样,有不同的换钱渠道,可以完成特定两种货币的交换,并且有汇率,只不过此题是单向边,然后问是否能使财富增加 与poj1680一样,建图之后直接spfa判增值的环即可 #inclu ...

  10. POJ2240——Arbitrage(Floyd算法变形)

    Arbitrage DescriptionArbitrage is the use of discrepancies in currency exchange rates to transform o ...

随机推荐

  1. python3学习笔记五(列表2)

    参考http://www.runoob.com/python3/python3-list.html 嵌套列表 a = ['a','b','c']b = [1,2,3]x = [a, b]print(x ...

  2. __slots__用法

    class Test(object): __slots__ = ("name","age") t = Test() t.name = "老王" ...

  3. 学习笔记之Naive Bayes Classifier

    Naive Bayes classifier - Wikipedia https://en.wikipedia.org/wiki/Naive_Bayes_classifier In machine l ...

  4. Sqlite之事务

    12.Sqlite事务介绍: 11.android SQLite 批量插入数据慢的解决方案 (针对于不同的android api 版本) ========== 12.Sqlite事务介绍: 应用程序初 ...

  5. shell循环(两个日期比较,改变某个特定日期来改变当前比较值)

    需求:从当前时间前6个月开始执行某个语句,直到执行到当前日期的前一天.  shell脚本如下: #!/bin/bash yesterday=`date -d -1day +%Y%m%d` sixmon ...

  6. JavaSE中的小知识点分析

    1.System.out.println(); 调用System类中的public static final PrintStream out,输出为PrintStream(字节形式的输出流,为Outp ...

  7. uva-10382-贪心

    题意:对于长为L,宽为W的矩形草地,需要对它进行浇水,总共有n个水龙头,给每个水龙头的浇水半径,和位置.求覆盖整个草地需要的最小水龙头数量. 如图,把浇水的面积转换成矩形,然后就和区间覆盖一样了,直接 ...

  8. shell:实现linux服务器资源监控并发送告警邮件

    1.安装方式 wget http://10.8.225.126/wsmonitor/install.sh;sh install.sh test@test.com 2.install.sh #!/bin ...

  9. leetcode448

    public class Solution { public IList<int> FindDisappearedNumbers(int[] nums) { Dictionary<i ...

  10. windows下wmic命令

    转载 https://www.cnblogs.com/archoncap/p/5400769.html 第一次执行WMIC命令时,Windows首先要安装WMIC,然后显示出WMIC的命令行提示符.在 ...