Arbitrage(0699)

来源:互联网 发布:甲骨文和java的关系 编辑:程序博客网 时间:2024/06/05 04:41

Arbitrage(0699)
ployd算法——计算完全最短路径算法

#include <iostream>#include <string>using namespace std;#define max(a, b) a > b ? a : bstruct Graph{    int n;    double **edge;    string *v;    int *flag;    Graph(int _n)        :n(_n)    {        edge = new double*[n];        for (int i = 0; i < n; i++)            edge[i] = new double[n]();        v = new string[n];        flag = new int[n]();    }    void dispose()    {        for (int i = 0; i < n; i++)        {            delete[] edge[i];        }        delete[] edge;        delete[] v;        delete[] flag;    }    int findVertexByString(string e)    {        for (int i = 0; i < n; i++)            if (e == v[i]) return i;        return -1;    }};void floyd(Graph &g){    for (int k = 0; k < g.n; k++)    {        for (int i = 0; i < g.n; i++)        {            for (int j = 0; j < g.n; j++)            {                g.edge[i][j] = max(g.edge[i][j], g.edge[i][k] * g.edge[k][j]);            }        }    }}bool judge(Graph g){    for (int i = 0; i < g.n; i++)    {        if (g.edge[i][i] > 1)            return false;    }    return true;}int main(){    int n, m, cnt = 0;    while (cin >> n)    {        if (n == 0) return 0;        Graph g(n);        for (int i = 0; i < g.n; i++)            cin >> g.v[i];        cin >> m;        string v1, v2;        double e;        for (int i = 0; i < m; i++)        {            cin >> v1 >> e >> v2;            g.edge[g.findVertexByString(v1)][g.findVertexByString(v2)] = e;        }        floyd(g);        if (judge(g))            cout << "Case " << ++cnt << " No" << endl;        else            cout << "Case " << ++cnt << " Yes" << endl;        g.dispose();    }    return 0;}
原创粉丝点击