算法總結——Bellman_ford

Bellman_ford:數組

複雜度:O(VE)  邊數函數

用途:一條路,錢幣的互換,尋找最小正權環,即一圈後能回到本身而且比本身大或者小,若是是大,d數組就開0,不然開infspa

適用條件:從源點到它的全部節點,適用於稀疏圖(頂點多,邊數少)code

原理:利用該頂點判斷操做以後與操做以前的比較blog

步驟:1.開一個d數組,以d[s]記錄初始值   2.n-1次鬆弛 3.判斷每個條件下是否盈利 4.若是每個結點都盈利說明成功,不然說明存在負權環 接口

模板:(main函數可忽略~只是爲了方便了解各個參數如何獲得) string

n-1次緣由:it

a->b, b->c, c->d這三條路徑io

假設每一步都是最短路模板

顯然a->d是圖中最短路徑,最壞的狀況是遍歷的邊先是c->d這條邊,發現此時並不知道b->c是能夠被用的,而後b->c, a->b

這樣一次循環結束,發現並無獲得最短路,而後如今已經獲得d點是從c點過來最優,c點是從b點過來最優,b點是從a點過來最優

那麼假設又是最壞狀況,仍舊是c->d, b->c, a->b, 此時結束後能夠獲得d點是從b點過來最優,c點是從a點過來最優

第二次循環結束,第三次循環開始,就知道了d是從a過來最優,顯然三次循環

若是是最優的狀況,即a->b, b->c, c->d

第一次循環中就知道b是從a過來最優, c是從a過來最優, d是從a過來最優

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct edge{
    int u;
    int v;
    int rate;
}a[300];
int s;
int d[300];
int n,m;
bool bellman_ford(int s)
{
    for(int i = 1; i <= n ;i++)
        d[i] = 0;
    d[s] = 1;//第s種爲單位1
    for(int i = 1; i <= n - 1 ; i++){//鬆弛n-1次,單純循環
          int   flag = 1;
       for(int j = 1; j <= m ; j++){//一共就這麼多交易規則
            if(d[a[j].v] < d[a[j].u]*a[j].rate){//若是盈利那麼更新
                    flag = 0;
              d[a[j].v] = d[a[j].u]*a[j].rate;
            }
       }
       if(flag) return true;//若是對於每個交易規則,a[d[j].v]一直等於d[a[j].u]*d[j].rate,說明沒有負環的存在,若是僅僅存在一個在接下來的交易中會把負環的接口補上
    }
    return false;//若是仍舊這樣,說明存在了負環補不上,使得d[a[j].v]又減少了。
}
int main()
{
    char temp[300][300];
    char  temp1[300],temp2[300];
    scanf("%d",&n);//一共n種貨幣
    for(int i = 1; i <= n ; i++)
        scanf("%s",temp[i]);
        scanf("%d",&m);//一共m種交易狀況
    for(int i = 1; i <= m ; i++){
        scanf("%s%s%d",&temp1[i],&temp2[i],&a[i].rate);
       for(int j = 1; j <= n; j++){
           if(strcmp(temp[j],temp1) == 0)
            a[i].u = j;
           if(strcmp(temp[j],temp2) == 0)
            a[i].v = j;
        }
     }
     int flag1 = 0;
     for(int i = 1; i <= n ; i++)//任意一種錢出發
     if(bellman_ford(i)==0){
            flag1 = 1;
          printf("NO\n");
     }
    if(!flag1)
        printf("YES\n");
   return 0;
}
相關文章
相關標籤/搜索