题目:
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
Case 1: Yes Case 2: No
题目分析:
使用floyd来求最长路。这道题需要注意以下的一些地方。
1)文字索引需要转化成数字索引。因为数组里面是数字索引。
string huobi_name; int i; for(i = 0 ; i < n ; ++i){//***将文字索引转换成数字索引.因为数组中用的是数字索引 cin >> huobi_name; money[huobi_name] = huobi_type++; }
2)求最长路时的floyd的初始化方法的写法。
/** * 这道题中floyd的初始化. * 以前的写法如上提所示. * 这里讲一下区别。以前是求最短路径,是一个由大到小的紧缩过程。 * 而这道题抽象以下其实是求最长路径,是一个由小到大的放大的过程 */ void initial() { int i, j; for (i = 1; i <= n; ++i) { for (j = 1; j <= n; ++j) { e[i][j] = 0;//所有东西一开始都初始化位0 } } }
3)求最长路时floyd函数的放缩的写法。其实就是把 > 换成 < 即可。
/** *floyd算法 */ void floyd() { int i, j, k; for (k = 1; k <= n; ++k) {//遍历所有的中间点 for (i = 1; i <= n; ++i) {//遍历所有的起点 for (j = 1; j <= n; ++j) {//遍历所有的终点 //*****floyd求最长路的写法 if (e[i][j] < e[i][k] * e[k][j]) {//如果当前i-->j的距离 小于 i-->k--->j的距离之和 e[i][j] = e[i][k] * e[k][j];//更新从i--->j的最短路径 } } } } }
这道题的代码如下:
/* * hdu1217.cpp * * Created on: 2015年3月27日 * Author: Administrator */ #include <iostream> #include <cstdio> #include <map> using namespace std; const int maxn = 31; double e[maxn][maxn]; int n; const int inf = 99999999; /* * void initial() { int i, j; for (i = 1; i <= n; ++i) { for (j = 1; j <= n; ++j) { if (i == j) { e[i][j] = 0; } else { e[i][j] = inf; } } } } * */ /** * 这道题中floyd的初始化. * 以前的写法如上提所示. * 这里讲一下区别。以前是求最短路径,是一个由大到小的紧缩过程。 * 而这道题抽象以下其实是求最长路径,是一个由小到大的放大的过程 */ void initial() { int i, j; for (i = 1; i <= n; ++i) { for (j = 1; j <= n; ++j) { e[i][j] = 0;//所有东西一开始都初始化位0 } } } /** *floyd算法 */ void floyd() { int i, j, k; for (k = 1; k <= n; ++k) {//遍历所有的中间点 for (i = 1; i <= n; ++i) {//遍历所有的起点 for (j = 1; j <= n; ++j) {//遍历所有的终点 //*****floyd求最长路的写法 if (e[i][j] < e[i][k] * e[k][j]) {//如果当前i-->j的距离 小于 i-->k--->j的距离之和 e[i][j] = e[i][k] * e[k][j];//更新从i--->j的最短路径 } } } } } int main(){ int cnt = 1; while(scanf("%d",&n)!=EOF,n){ map<string,int> money; int huobi_type = 1; string huobi_name; int i; for(i = 0 ; i < n ; ++i){//***将文字索引转换成数字索引.因为数组中用的是数字索引 cin >> huobi_name; money[huobi_name] = huobi_type++; } initial(); int m; scanf("%d",&m); while(m--){ string from; string to; double change; cin >> from >> change >> to; e[money[from]][money[to]] = change; } floyd(); bool flag = false; for(i = 1 ; i <= n ; ++i){//遍历所有的货币 if(e[i][i] > 1){//看是否存在一种货币经过一个兑换回路以后 >= 1个单元 //如果存在 flag = true;//则将flag标记为true。 break;//跳出循环 } } //输出最后的结果 if(flag == true){ printf("Case %d: Yes\n",cnt++); }else{ printf("Case %d: No\n",cnt++); } } return 0; }