poj2240(Floyd最短路的變種---最長路 )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
Test cases are separated from each other by a blank line. Input is terminated by a value of zero (0) for n.
Output
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;
}
相關推薦
poj2240(Floyd最短路的變種---最長路 )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,考慮線段樹優化。