hdu 1217最短路(bellmanFord)

View Code
/*
  Name: 最短路(bellmanFord) 
  Copyright: 
  Author: Try86 
  Date: 18/04/12 13:50
  Description: 判断是否从某一种货币出发经过一系列的转换后回到自身时,货币币值增加 
*/

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>

using namespace std;

const int N = 35;
const int M = 1000;

double d[N];
char names[N][N], str1[N], str2[N];
struct edge {
    int u;
    int v;
    double w;
}e[M];

int cmp(const void *a, const void *b) {
    return strcmp((char *)a, (char *)b);
}

int binarySearch(char *str, int n) {
    int left = 0;
    int right = n;
    while (left <= right) {
        int mid = (left + right) / 2;
        if (!strcmp(names[mid], str)) return mid;
        else if (strcmp(names[mid], str) > 0) right = mid - 1;
        else left = mid + 1;
    }
}

void relax(int u, int v, double w) {//松弛,权值相乘 
    if (d[v] < d[u]*w) d[v] = d[u] * w;
    return ;
}

bool bellmanFord(int m, int n, int s) {
    memset(d, 0, sizeof(d));//初始化 
    d[s] = 1;
    for (int i=0; i<n; ++i) {
        for (int j=0; j<m; ++j) {
            relax(e[j].u, e[j].v, e[j].w);
        }
    }
    return d[s] > 1.0;//判断转换后币值是否增加 
}

int main() {
    int n, t = 0;
    double w;
    while (scanf("%d", &n), n) {
        for (int i=0; i<n; ++i) scanf ("%s", names[i]);
        qsort(names, n, sizeof(names[0]), cmp);
        int m;
        scanf ("%d", &m);
        for (int i=0; i<m; ++i) {
            scanf ("%s%lf%s", str1, &w, str2);
            int u = binarySearch(str1, n);
            int v = binarySearch(str2, n);
            e[i].u = u, e[i].v = v, e[i].w = w;
        }
        bool flag;
        for (int i=0; i<n; ++i) {//以每种货币为源点,进行最短路操作 
            flag = bellmanFord(m, n, i);
            if (flag) break;//存在符合条件的货币,退出 
        }
        if (flag) printf ("Case %d: Yes\n", ++t);
        else printf ("Case %d: No\n", ++t);
    }
    return 0;
}

 

posted on 2012-04-18 17:32  Try86  阅读(178)  评论(0)    收藏  举报