zoukankan      html  css  js  c++  java
  • nyoj Arbitrage (Bellman-Ford)

    跟天下第一挺像的

     1 void Bellman(int v0)
     2 {
     3     int i, k;
     4     for (int i = 0; i < n; ++i) {
     5         dist[i] = INF, path[i] = -1;
     6     }
     7     dist[v0] = 0;
     8     for (k = 1; k < n; ++k) {
     9         for (i = 0; i < m; ++i) {
    10             if (dist[edges[i].u] != INF && edges[i].w + dist[edges[i].u] < dist[edges[i].v]) {
    11                 dist[edges[i].v] = edges[i].w + dist[edges[i].u];
    12                 path[edges[i].v] = edges[i].u;
    13             }
    14         }
    15     }
    16 }
    17 
    18 //判断是否存在从原点可达的负权值回路
    19 for (i = 0; i < m; ++i) {
    20     if (dist[edges[i].u] != INF && edges[i].w + dist[edges[i].u] < dist[edges[i].v])
    21         return 0;
    22 }
    23 return 1;
    Bellman

     该算法还可以求最长路径

    Bellman-Ford 判断环 + 最大路径值是否大于1

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<string>
     6 #include<queue>
     7 #include<algorithm>
     8 #include<map>
     9 #include<iomanip>
    10 #include<climits>
    11 #include<string.h>
    12 #include<cmath>
    13 #include<stdlib.h>
    14 #include<vector>
    15 #include<set>
    16 #define INF 1e7
    17 #define MAXN 100010
    18 #define maxn 50
    19 #define maxm 1000
    20 #define Mod 1000007
    21 using namespace std;
    22 typedef long long LL;
    23 
    24 struct exchange{
    25     int ci, cj;
    26     double cij;
    27 }ex[maxm];
    28 int i, j, k;
    29 int n, m;
    30 string name[maxn], a, b;
    31 double x, maxdist[maxn];
    32 bool flag;
    33 int kase = 0;
    34 
    35 int readkase()
    36 {
    37     cin >> n;
    38     if (n == 0) return 0;
    39     for (i = 0; i < n; ++i)
    40         cin >> name[i];
    41     cin >> m;
    42     for (i = 0; i < m; ++i) {
    43         cin >> a >> x >> b;
    44         for (j = 0; a != name[j]; ++j);
    45         for (k = 0; b != name[k]; ++k);
    46         ex[i].ci = j, ex[i].cj = k, ex[i].cij = x;
    47     }
    48     return 1;
    49 }
    50 
    51 void Bellman(int v0)
    52 {
    53     flag = false;
    54     memset(maxdist,0,sizeof(maxdist));
    55     maxdist[v0] = 1;
    56     for (k = 1; k <= n; ++k) {   //从maxdist(0)递推到maxdist(n)
    57         for (i = 0; i < m; ++i) {//判断加入每条边是否能是最大距离增大
    58             if (maxdist[ex[i].ci] * ex[i].cij > maxdist[ex[i].cj])
    59                 maxdist[ex[i].cj] = maxdist[ex[i].ci] * ex[i].cij;
    60         }
    61     }
    62     if (maxdist[v0] > 1.0) flag = true;
    63 }
    64 
    65 int main()
    66 {
    67     while (readkase()) {
    68         for (int i = 0; i < n; ++i) {
    69             Bellman(i);
    70             if (flag) break;
    71         }
    72         if (flag) printf("Case %d: Yes
    ",++kase);
    73         else printf("Case %d: No
    ", ++kase);
    74     }
    75     return 0;
    76 }
  • 相关阅读:
    五层原理体系结构的简单分析
    Simple Factory 简单工厂模式(静态工厂)
    css一个图片包含多个图片|网站侧栏导航
    百度地图、高德地图的数据从哪里得到的?
    浏览器开发
    开发一款浏览器内核需要学习哪些方面的知识?
    使用PowerDesigner进行数据库建模入门
    How to create a search engine
    合并两个有序数组
    STL中的algorithm
  • 原文地址:https://www.cnblogs.com/usedrosee/p/4337795.html
Copyright © 2011-2022 走看看