您的位置:首页 > 其它

HDU 1217 Arbitrage(Flody)

2015-09-07 20:53 387 查看
Flody的变形,初始化所有d[i][i] = 1,其他为0。 这样在Flody的时候取大就行了。 然后检查所有点d[i][i]是否有大于1的。

细节参见代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
const double INF = 1000000000;
const int maxn = 30 + 5;
int n,m,kase = 0,id1,id2;
double d[maxn][maxn],v;
bool solve() {
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        d[i][j] = max(d[i][j],d[i][k]*d[k][j]);
    for(int i=1;i<=n;i++)
        if(d[i][i] > 1.0) return true;
    return false;
}
map<string,int> p;
char s1[10000],s2[10000];
int main() {
    while(~scanf("%d",&n)&&n) {
        p.clear();
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++) d[i][j] = (i == j ? 1 : 0);
        for(int i=1;i<=n;i++) {
            scanf("%s",s1);
            p[s1] = i;
        }
        scanf("%d",&m);
        for(int i=0;i<m;i++) {
            scanf("%s%lf%s",s1,&v,s2);
            id1 = p[s1];
            id2 = p[s2];
            d[id1][id2] = v;
        }
        if(solve()) printf("Case %d: Yes\n",++kase);
        else printf("Case %d: No\n",++kase);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: