kuangbin_ShortPathI (POJ 2240)

本身很简单的spfa判环 TLE了一把是因为没写map(不会)

看着别人的答案临时学了一发发现只是用的话还是挺简单的 (但是绝对别学别人直接命名为m) 800多MS水过

噢对了这题Pending到超时了三次 POI绝对有毒

#include <iostream>
#include <cstring>
#include <string>
#include <queue>
#include <map>
#include <algorithm>
using namespace std;

map<string, int> mapp;
double val[40][40];
int n, m;

bool spfa(int s)
{
    double dis[40];
    bool vis[40];
    int time[40];
    memset(dis, 0, sizeof dis);
    memset(vis, 0, sizeof vis);
    memset(time, 0, sizeof time);

    queue<int> q;
    dis[s] = 1.0;
    vis[s] = true;
    q.push(s);
    while(!q.empty()){
        int u = q.front();
        q.pop();
        vis[u] = false;
        for(int i = 1; i <= n; i++){
            if(dis[i] < dis[u] * val[u][i]){
                dis[i] = dis[u] * val[u][i];
                if(!vis[i]){
                    vis[i] = true;
                    q.push(i);
                    if(++time[i] >= n) return true;
                }
            }
        }
    }
    return false;
}
int main()
{
    int kase = 0;
    while(1){
        cin >> n;
        if(n == 0) break;
        memset(val, 0, sizeof val);
        for(int i = 1; i <= n; i++){
            string str;
            cin >> str;
            mapp[str] = i;
        }
        cin >> m;
        for(int i = 1; i <= m; i++){
            string str1, str2;
            double value;
            cin >> str1 >> value >> str2;
            val[mapp[str1]][mapp[str2]] = value;
        }
        if(spfa(1)) cout << "Case " << ++kase << ": Yes" << endl;
        else cout << "Case " << ++kase << ": No" << endl;
    }
    return 0;
}
时间: 2024-12-21 09:33:39

kuangbin_ShortPathI (POJ 2240)的相关文章

poj 2240

Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14832   Accepted: 6255 Description 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 currenc

POJ 2240 Arbitrage

Bellman 求最大环. 询问货币是否纯在套汇. 假如给你 1 元,通过兑换之后 超过 1 元就是存在套汇了. 用 map 映射比较方便. #include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<queue> #include<map> #include<iostream>

poj 2240 Arbitrage 题解

Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 21300   Accepted: 9079 Description 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 currenc

poj 2240 Arbitrage (Floyd)

链接:poj 2240 题意:首先给出N中货币,然后给出了这N种货币之间的兑换的兑换率. 如 USDollar 0.5 BritishPound 表示 :1 USDollar兑换成0.5 BritishPound. 问在这N种货币中是否存在货币经过若干次兑换后,兑换成原来的货币能够使货币量添加. 思路:本题事实上是Floyd的变形.将变换率作为构成图的路径的权值.只是构成的图是一个有向图. 最后将松弛操作变换为:if(dis[i][j]<dis[i][k]*dis[k][j]). #includ

poj 2240 Bellman-Flod 求环

http://poj.org/problem?id=2240 深刻体现了自己代码能力有问题外加改模板能力有问题,外加Debug有问题.以后做到: 1.算法原理可以轻易弄出来, 2.代码模板自己收集各种用法,以及已经的做过的改变的方法: 3.没有完整清晰的思路不敲代码: 4.在Debug时没有基本绝对的把握,不点击"编译+运行",不乱试 回到这道题: 我主要是想把Bellman-Ford的模板改为链式前向星的,然后就各种悲剧调试...... 学到三点:1.比例的初始化,求最大,源1.0,

POJ 2240 -- Arbitrage(Bellman-Ford)

POJ 2240 -- Arbitrage(Bellman-Ford) 题意: 已知n种货币,以及m种货币汇率及方式,问能否通过货币转换,使得财富增加. Bellman-ford 算法: 一个具有n个顶点的图如果不存在环,则从顶点x,到顶点y,最多经过n-1条边(要考虑连通性,每个顶点最多经过 1 次),因此 x 到 y 的最短路 最多经过 n - 1 次松弛操作(就是更新长度)就应该出现,如果第 n 次松弛还可以得到最优,那么这个图就肯定是存在环了(直接用Dijkstra 就无法得到最优的,环

Arbitrage POJ 2240

http://poj.org/problem?id=2240 题意:现你有N种货币,在进行货币进行兑换后,最终仍需兑换成原本货币,若其中某一种货币增加了,就输出“Yes”,否则输出“No”. 一开始TLE了, 因为 return 1 的位置放错了.. 一开始没咋想,直接放到最后判断了... #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include

poj 2240 Arbitrage(bellman-ford 判断正环)

http://poj.org/problem?id=2240 基本和poj 1860相同 只是把单点变成了任意点 做完1860再做这题就完全把思路套上就过了 做完才发现网上的题解都用的是floyd 不过整体思路都是大同小异吧 不过在效率上好像就低下了太多= = #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<stack> #include<

Arbitrage - poj 2240 (Bellman-ford)

Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17374   Accepted: 7312 Description 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 exa