1. 程式人生 > >HDU 1217 Arbitrage(弗洛伊德演算法)

HDU 1217 Arbitrage(弗洛伊德演算法)

Arbitrage

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8989    Accepted Submission(s): 4145


Problem 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 example, suppose that 1 US Dollar buys 0.5 British pound, 1 British pound buys 10.0 French francs, and 1 French franc buys 0.21 US dollar. Then, by converting currencies, a clever trader can start with 1 US dollar and buy 0.5 * 10.0 * 0.21 = 1.05 US dollars, making a profit of 5 percent. 

Your job is to write a program that takes a list of currency exchange rates as input and then determines whether arbitrage is possible or not.

Input The input file will contain one or more test cases. Om the first line of each test case there is an integer n (1<=n<=30), representing the number of different currencies. The next n lines each contain the name of one currency. Within a name no spaces will appear. The next line contains one integer m, representing the length of the table to follow. The last m lines each contain the name ci of a source currency, a real number rij which represents the exchange rate from ci to cj and a name cj of the destination currency. Exchanges which do not appear in the table are impossible.
Test cases are separated from each other by a blank line. Input is terminated by a value of zero (0) for n. 

Output For each test case, print one line telling whether arbitrage is possible or not in the format "Case case: Yes" respectively "Case case: No". 

Sample Input 3 USDollar BritishPound FrenchFranc 3 USDollar 0.5 BritishPound BritishPound 10.0 FrenchFranc FrenchFranc 0.21 USDollar 3 USDollar BritishPound FrenchFranc 6 USDollar 0.5 BritishPound USDollar 4.9 FrenchFranc BritishPound 10.0 FrenchFranc BritishPound 1.99 USDollar FrenchFranc 0.09 BritishPound FrenchFranc 0.19 USDollar 0
Sample Output Case 1: Yes Case 2: No
#include<iostream>
#include<map>
#include<cstdio>
const int INF=0x3f3f3f3f; int n,m; double d[35][35]; using namespace std; map<string,int>mp; void init() { for(int i=0;i<=34;i++) for(int j=0;j<=34;j++) if(i==j?d[i][j]=1:d[i][j]=-INF*1.00);//注意相等初始化為1,不是0. } bool ff() { int i,j,k; for(i=1;i<=n;i++) { for
(
j=1;j<=n;j++) { for(k=1;k<=n;k++) { d[j][k]=max(d[j][k],d[j][i]*d[i][k]); if(d[j][k]>1&&k==j)return 1; } } } return 0; } int main() { int i,j,k,case1=1; while
(
scanf("%d",&n)!=EOF) { init(); if(!n)break; for(i=1;i<=n;i++) { string s;s.resize(20); scanf("%s",&s[0]); mp[s]=i;//字元轉數字 } scanf("%d",&m); for(i=1;i<=m;i++) { string t1,t2;double q;t1.resize(20);t2.resize(20); scanf("%s %lf %s",&t1[0],&q,&t2[0]); int v=mp[t1],u=mp[t2]; d[v][u]=q; } printf("Case %d: ",case1++); if(ff())printf("Yes\n"); else printf("No\n"); } return 0; }

相關推薦

HDU 1217 Arbitrage(演算法

Arbitrage Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8989    Accepted Subm

最短路徑(鄰接矩陣演算法

#include<bits/stdc++.h> #define MaxInt 1e8 #define MVNum 100 #define OK 1 #define ERROR 0 using namespace std; typedef int VerTexType; typedef i

Warshall(演算法

    簡介:Floyd演算法又稱為插點法,是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的演算法,與Dijkstra演算法類似。該演算法名稱以創始人之一、1978年圖靈獎獲得者、斯坦福大學計算機科學系教授羅伯特·弗洛伊德命名。eg:暑假,小哼準備去一些城市旅遊

Floyd algorithm!!!!!(萬惡的演算法

        曾經有位滑稽的博主說過:搜尋就是優雅的暴力。今天他又要說,DP就是優雅地搜尋。         不是每一個弗洛伊德都寫演算法,也不是寫演算法的都叫弗洛伊德,還有一位人家寫性學三論去了。         這位弗洛伊德來歷不一般,斯坦福大學的教授,1978年的

六度分離(演算法

六度分離Time Limit : 5000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)Total Submission(s) : 29   Accepted Submission(s) : 10

Floyd-Warshall(演算法

Floyd演算法是用來找出每對頂點之間的最短距離,即適用於多源最短路經,它對圖的要求是,既可以是無向圖也可以是有向圖,邊權可以為負,但是不能存在負環(可根據最小環的正負來判定). 具體可閱讀以下博文: 問題集錦:

floydwarshall演算法演算法的理解,就一句話

floydwarshall algorithm(弗洛伊德演算法):對每一個頂點,都要嘗試它作為任一對頂點的中轉頂點的可能性。基於此,形成一個基礎資料庫。在這個基礎資料庫的基礎上,追溯出任意兩點的最短路徑。 對幾個疑問的解釋: 1.簡單的迴圈條件,如for (k=0;k&l

最短路徑(演算法

1 原理 ,假設存在一個最簡單的連通圖 2 程式碼 package leaning.graph; /* * * 弗洛伊德演算法求最短路徑 * * */ public class Floyd { // 表示V0頂點到v8頂點的最短

程式設計基礎26 演算法

題目描述 在帶權有向圖G中,求G中的任意一對頂點間的最短路徑問題,也是十分常見的一種問題。 解決這個問題的一個方法是執行n次迪傑斯特拉演算法,這樣就可以求出每一對頂點間的最短路徑,執行的時間複雜度為O(n3)。 而另一種演算法是由弗洛伊德提出的,時間複雜度同樣是O(n3),但演算法的形式

最短路徑-Floyd()演算法

最短路徑-Floyd(弗洛伊德)演算法 簡介: 相較Dijkstra,Floyd是一個完全窮舉圖中每個點到末尾點的最短路徑 演算法思想: 按慣例說兩個工具 Path[MAX_SIZE][MAX_SIZE]:儲存所有的最短路徑(指向

拓撲排序以及迪傑斯特拉演算法演算法的一些例子(天勤資料結構

拓撲排序核心演算法     在一個有向圖中找到一個拓撲排序的過程如下:     1)從一個有向圖中選擇一個沒有前驅(入度為0)的頂點輸出;     2)刪除1)中的頂點,並刪除從該頂點出發的全部邊;  

結點對最短路徑Floyd演算法解析

        暑假,小哼準備去一些城市旅遊。有些城市之間有公路,有些城市之間則沒有,如下圖。為了節省經費以及方便計劃旅程,小哼希望在出發之前知道任意兩個城市之前的最短路程。         上圖中有4個城市8條公路,公路上的數字表示這條公路的長短。請注意這些公

最短路徑迪傑斯特拉演算法演算法實現

迪傑斯特拉演算法: 矩陣二位陣列矩陣T儲存頂點vi到各頂點的最短路徑值,初始狀態為鄰接頂點為弧的權值,非鄰接頂點為無窮大。陣列S用於儲存最短路徑,儲存單元為該弧的前驅頂點的下標和與前驅頂點之間的弧的權值。 1.從T中找出一條弧值最小的弧(vi,vj),將該弧加入S中,並根據vj的鄰接點vx更

資料結構篇:校園最短路徑導航(二:演算法理解與應用

求最短路徑最常用的有迪傑斯特拉(Dijkstra)和弗洛伊德(Floyd)演算法兩種。本著簡潔為王道的信條,我選擇了Floyd演算法。 Floyd演算法 首先來看一個簡單圖,紅色標記代表在陣列的下標,橙色標記代表距離(邊權值) 我們用D[6][6]這個矩陣儲存兩點之間最短路徑,

說說演算法

弗洛伊德演算法,是當時集訓的時候學最短路問題的第一個演算法(去年寒假),當時學長直說這個演算法好寫、時間複雜度高,至於這個演算法是什麼原理卻沒有講。學長說,照著敲就可以,迴圈敲對了,就那麼神奇的對了,迴圈順序錯了,就神奇的WA了。 今年寒假,我也是學長了,逗比碩把最短路給我了,就變成這一週我要

演算法-----最短路徑演算法(一

學習此演算法的原因:昨天下午遛彎的時候,碰到閨蜜正在看演算法,突然問我會不會弗洛伊德演算法?我就順道答應,然後用了半個小時的時間,學習了此演算法,並用5分鐘講解給她聽,在此也分享給各位需要的朋友,讓你們在最短的時間內,透徹的掌握該演算法。 Robert W. Floyd(

C語言演算法的實現

弗洛伊德演算法和迪傑斯特拉演算法一樣,用於求兩個節點之間的最短路徑,過程也比迪傑斯特拉演算法更為簡單。以下是實現程式碼:首先仍然是預定義和型別定義:#define OK 1 #define ERROR 0 #define Max_Int 37262 #define MVNum

多源最短路徑演算法(java不含具體路徑

  Floyd-Warshall演算法(Floyd-Warshall algorithm)是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題。   import java.util.Arrays; public class Florid

Floyd()演算法 詳解+模板

弗洛伊德演算法介紹 和Dijkstra演算法一樣,弗洛伊德(Floyd)演算法也是一種用於尋找給定的加權圖中頂點間最短路徑的演算法。該演算法名稱以創始人之一、1978年圖靈獎獲得者、斯坦福大學計算機科學系教授羅伯特·弗洛伊德命名。 基本思想 通過Floyd計算

【原創】求最短路徑-演算法

有這樣一類題,它要求你從某個點出發,到某個為止走過的最短路徑。當然不會有這種題“從A點出發到B點”。一般來講,是這樣的題目“小明從重慶出發到北京,蘭後可以中轉3個城市,每個城市有1個機場或1條公路連