1. 程式人生 > >poj2240(Floyd最短路的變種---最長路 )Arbitrage

poj2240(Floyd最短路的變種---最長路 )Arbitrage

Arbitrage
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 12761 Accepted: 5392

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 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

題目大意及其思路:問你能不能找到一個圈,使沿著這個圈兌換錢幣後錢數增加。
解法:路徑為匯率,由於自環匯率是1,因此,我們要找一個圈作用的結果大於1。因為題目給得很清楚,是邊邊相乘,於是就是路徑鬆弛的時候改成相乘就可以了。下面我用map進行字串與節點編號的對映。(一開始習慣性的把G[][]宣告int.....好腦殘啊)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <vector>
#include <algorithm>
#include <string>
#include <map>
using namespace std;
const int maxn=40;
const int inf=-10000000;
double G[maxn][maxn];
int n,m;
map<string, int > Map;    //終於知道STL的強大之處了,雖然慢了一點
int main()
{
    freopen("in.txt","r",stdin);
	string s,sa,sb;
	int cas=0;
	double rate;
	while(scanf("%d",&n)!=EOF&&n!=0)
	{
		memset(G,0,sizeof(G));
		Map.clear();
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				if(i==j)	G[i][j]=1;
				else	G[i][j]=-inf;
			}
		}
		for(int i=1;i<=n;i++)
		{
			cin>>s;
			Map[s]=i;     //map的對映關係
		}
		cin>>m;
		for(int i=1;i<=m;i++)
		{
			cin>>sa>>rate>>sb;
			G[Map[sa]][Map[sb]]=rate;
			//cout<<Map[sa]<<' '<<Map[sb]<<' '<<rate<<endl;
			//cout<<G[Map[sa]][Map[sb]]<<endl;
		}
		/*                         //開關除錯法,輸出中間值,很有用的哦
		for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
                cout<<i<<' '<<j<<' '<<G[i][j]<<endl;
        }
        //*/
		for(int k=1;k<=n;k++)         //標準的Floyd
		{
			for(int i=1;i<=n;i++)
			{
				for(int j=1;j<=n;j++)
				     if(G[i][j]!=inf&&G[i][k]!=inf&&G[k][j]!=inf)
                                              G[i][j]=max(G[i][k]*G[k][j],G[i][j]);
			}
		}

		/*cout<<endl;
		for(int i=1;i<=n;i++)
                {
                 for(int j=1;j<=n;j++)
                        cout<<i<<' '<<j<<' '<<G[i][j]<<endl;
                 }//*/ 

		bool is_ok=false;
		for(int i=1;i<=n;i++)
		{
		    if(G[i][i]>1)
                     {
                          is_ok=1;
                          break;
                     }         
		}
		if(is_ok)	printf("Case %d: Yes\n", ++cas);
		else 	printf("Case %d: No\n", ++cas);
	}
    return 0;
}


 

相關推薦

poj2240Floyd短路變種--- Arbitrage

Arbitrage Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12761 Accepted: 5392 Description Arbitrage is the use of discrep

noip 2009 優貿易短路+反向

輸出 main 路線 ins 城市 mes 部分 cst don 題目描述 C 國有 n 個大城市和 m 條道路,每條道路連接這 n 個城市中的某兩個城市。任意兩個城市之間最多只有一條道路直接相連。這 m 條道路中有一部分為單向通行的道路,一部分為雙向通行的道路,雙向通行

第六章 短路徑——有向圖Floyd-Warshall、Dijkstra、Bellman-Ford

數組 opened 表示 printf 開始 style logs include 五行 一、Floyd-Warshall——加入點(多源最短路徑,核心算法只有五行) 城市之間的最短路徑 輸入: 4 8 1 2 2 1 3 6 1 4 4 2 3 3 3 1 7 3 4

2017CCPC中南地區賽 H題

main art spa fine sca using push_back ear 端點 題目地址:202.197.224.59/OnlineJudge2/ 來自湘潭大學OJ,題號:1267。 這裏用到了一個樹的直徑(樹中的最長邊)的結論:當你找到一棵樹的最長邊後,這個樹中

UVA 1599 Ideal Path雙向bfs+字典序+非簡單圖的短路+隊列判重

ems code can scan min 時機 define index end https://vjudge.net/problem/UVA-1599 給一個n個點m條邊(2<=n<=100000,1<=m<=200000)的無向圖,每條邊上都塗

bzoj1266 [AHOI2006]上學路線route floyd建出短路圖+小割

rem += 就是 ble front 可能 LG hint color 1266: [AHOI2006]上學路線route Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2490 Solved: 898[Submit

The Largest Clique UVA - 11324 強連通分量 + dp

強連通分量 top 起點 printf push fin clas int clu 這題 我剛開始想的是 縮點後 求出入度和出度為0 的點 然後統計個數 用總個數 減去 然而 這樣是不可以的 畫個圖就明白了。。。 如果 減去度為0的點 那麽最後如果出現這

HDU 1142 A Walk Through the Forest短路+記憶化搜索

大於 take tin href init sizeof itl any problem A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/327

BZOJ5109 CodePlus 2017大吉大利,晚上吃雞!短路+拓撲排序+bitset

  首先跑正反兩遍dij求由起點/終點到某點的最短路條數,這樣條件一就轉化為f(S,A)*f(T,A)+f(S,B)*f(T,B)=f(S,T)。同時建出最短路DAG,這樣圖中任何一條S到T的路徑都是最短路徑,對於條件二就只需要判斷A是否能走到B。注意到空間開的非常大。那麼對於條件二的可達性顯然是可以bits

BZOJ5450: 轟炸水題,Tarjan縮點求

5450: 轟炸 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 43  Solved:18[Submit][Status][Discuss] Description 有n座

狼抓兔子 HYSBZ - 1001 平面圖轉對偶圖短路小割

狼抓兔子  HYSBZ - 1001  現在小朋友們最喜歡的"喜羊羊與灰太狼",話說灰太狼抓羊不到,但抓兔子還是比較在行的, 而且現在的兔子還比較笨,它們只有兩個窩,現在你做為狼王,面對下面這樣一個網格的地形:   左上角點為(1,1),右下角點為(

無環圖的短路路徑

1.DAG最短路(基於拓撲排序優化的Dijkstra演算法) 拓撲排序給予了我們查詢順序的正確性,也減少了不必要的查詢. (1)先對路徑長度陣列初始化,源點為0,其餘為無窮大(這裡用100000代替)。 (2)對圖進行遍歷,因為有n個點,外部迴圈n次。每個點e個邊內部迴圈e次(複雜度

POJ 1201差分約束+

題意:一個整數集合Z有n個區間,每個區間有3個值,ai,bi,ci代表,在區間[ai,bi]上至少有ci個整數屬於集合Z,ci可以在區間內任意取不重複的點。現在要滿足所有區間的約束條件,問最少可選多少個點。 思路:首先得了解何為差分約束,https://blog.csdn.

1001 平面圖轉對偶圖短路小割

狼抓兔子 現在小朋友們最喜歡的"喜羊羊與灰太狼",話說灰太狼抓羊不到,但抓兔子還是比較在行的, 而且現在的兔子還比較笨,它們只有兩個窩,現在你做為狼王,面對下面這樣一個網格的地形:   左上角點為(1,1),右下角點為(N,M)(上圖中N=4,M=5).有以下三種

hdu2066一個人的旅行短路多起點多終點

一個人的旅行 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 52753  

Codeforces ~ 1076D ~ Edge Deletion 短路,堆優化理解

題意 給你一個n個點,m條邊的DAG圖,邊為雙向邊,沒有重邊。現在最多保留k條邊,怎麼使得好點個數最多。 好點定義為:在原圖中1到該點距離和只保留某一些邊後的圖中1到該點距離不變的點。 先輸出保留邊的

【POJ 3592】 Instantaneous Transference強連通縮點+

It was long ago when we played the game Red Alert. There is a magic function for the game objects which is called instantaneous transfer. When an object u

圖的遍歷dfs、bfs、短路小生成樹、拓撲排序

程式碼如下: #include <cstdio> #include <cmath> #include <vector> #include <cstring> #include <algorithm> using n

【POJ】3463 Sightseeing 短路+比短路大一的短路 or 短路+DP

BAPC 2006 Qualification題型:求最短路以及比最短路長度大一的次短路,並要求計數。傳送門:【POJ】3463 Sightseeing 題目大意:給你n個點m條邊的有向圖(unidirectional是有向!),讓你求最短路以及長度比最短路大一的路的數量。題目保證數量不超過10^9。(2 ≤

車站分級 線段樹優化建邊 拓撲序

車站分級(加強版) 10.11 思路: 基本方法就是等級高的車站向等級低的車站連邊,最後跑拓撲序的最長路就是ans。 線段樹優化建邊的拓撲排序(線段樹的神奇應用)。 先是建虛點優化,邊數優化為2*n,但是發現建邊的複雜度是nm,考慮線段樹優化。