spfa(判負環變形)

2022-09-06 22:51:16 字數 1663 閱讀 9795

題目鏈結

題意:n種貨幣,m種交換、s、v 。邊:u、v、r1、c1、r2、c2表示u貨幣換成v貨幣需要c1手續費和交換率r1,v換u為c2,r2.(轉換公式:val[v] = (val[u]-c1)r1)

初始有s貨幣v枚。問能否通過一系列的交換,可以獲得比初始更多的錢?

解法:

//#include#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll ;

#define int ll

#define mod 100

#define gcd(m,n) __gcd(m, n)

#define rep(i , j , n) for(int i = j ; i <= n ; i++)

#define red(i , n , j) for(int i = n ; i >= j ; i--)

#define me(x , y) memset(x , y , sizeof(x))

//int lcm(int a , int b)

//ll quickpow(ll a , ll b)return ans;}

//int euler1(int x)if(x>1)ans-=ans/x;return ans;}

//const int n = 1e7+9; int vis[n],prime[n],phi[n];int euler2(int n)for(int j=1;j#define fi first

#define se second

#define lson l,mid,root<<1

#define rson mid+1,r,root<<1|1

#define pb push_back

#define mp make_pair

#define all(v) v.begin(),v.end()

#define size(v) (int)(v.size())

#define cin(x) scanf("%lld" , &x);

const int n = 1e4+9;

const int maxn = 1e3+9;

const double esp = 1e-6;

int head[maxn] , tol ;

int n , m , s ;

double v;

int vis[maxn] , ans[maxn];

double dis[maxn];

struct nodeg[maxn<<1];

void add(int u , int v , double w , double p);

head[u] = tol;

}bool spfa(int u)}}

}}

return true;

}void init()

void solve()

if(spfa(s))else

}signed main()

模板 Spfa判負環

給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。請你判斷圖中是否存在負權迴路。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。輸出格式 如果圖中存在負權迴路,則輸出 yes 否則輸出 no 資料範圍 1 n 20...

TT 的美夢(SPFA判負環)

這一晚,tt 做了個美夢!在夢中,tt 的願望成真了,他成為了喵星的統領!喵星上有 n 個商業城市,編號 1 n,其中 1 號城市是 tt 所在的城市,即首都。喵星上共有 m 條有向道路供商業城市相互往來。但是隨著喵星商業的日漸繁榮,有些道路變得非常擁擠。正在 tt 為之苦惱之時,他的魔法小貓咪提出...

spfa演算法及判負環詳解

spfa shortest path faster algorithm 是一種單源最短路徑的演算法,基於bellman ford演算法上由佇列優化實現。也就是說,bellman ford是一種無腦,瘋狂鬆弛的演算法。其複雜度為o nm 可想而知,對於上萬的資料會炸的一塌糊塗。相對而言,spfa顯得就...