SPFA算法
迪杰斯特拉算法不能解决具有负边权的问题所以就需要SPFA算法来判断负环(当有负环的时候肯定是走负环可以达到最小,,,,)
POJ2240
因为汇率可以大于或小于1,所以就可以把汇率大于1的交换方法看作负边权,
只需要使用SPFA算法使初始点的值大于初始值就好。
#include<stdio.h>
#include<string.h>
#include<queue>
#include<map>
#include<string>
#include<iostream>
#define inf 1<<29
#define maxn 50
using namespace std;
struct h{
int e;
double t;
};
int cnt;
vector<h> v[maxn];
bool bk[maxn];
double d[maxn];
bool spfa(){
d[0]=1;
bk[0]=1;
queue<int> q;
while(!q.empty())
q.pop();
q.push(0);
while(!q.empty()){
int x=q.front();
q.pop();
bk[x]=0;
for(int i=0;i<v[x].size();i++){
if(d[v[x][i].e]<d[x]*v[x][i].t){
d[v[x][i].e]=v[x][i].t*d[x];
if(d[0]>1.0)
return 1;
if(bk[v[x][i].e]==0){
q.push(v[x][i].e);
bk[v[x][i].e]=1;
}
}
}
}
return 0;
}
int main(){
int n;
int T=1;
while(~scanf("%d",&n)&&n){
map <string,int> p;
for(int i=0;i<n;i++){
string a;
cin>>a;
p[a]= i;
}
int n1;
scanf("%d",&n1);
for(int i=0;i<n1;i++){
string a,b;
double v1;
cin>>a>>v1>>b;
v[p[a]].push_back(h{p[b],v1});
}
for(int i=0;i<n;i++){
bk[i]=0;
d[i]=0;
}
printf("Case %d: ",T++);
if(spfa()==1)
printf("Yes\n");
else
printf("No\n");
for(int i=0;i<n;i++){
v[i].clear();
}
p.clear();
}
return 0;
}