BellMan 算法解决
一直用迪杰斯特拉算法求最短路问题,一看到最短路就思维固定。要根据不同问题的特点用不同的算法。
附上代码,对bellman算法理解的不算深刻。

#include <cstdio>//判断最长路径是否有正环
#include <algorithm>
using namespace std;
const int N=105;
int n,m,s;
double v;
double dis[N];
struct node
{
    int a,b;
    double rab,cab,rba,cba;
}edge[N];
int bellman()
{
    for(int i=1;i<=n;i++)
        dis[i]=0;
    dis[s]=v;
    int flag;
    for(int i=1;i<=n;i++)//O(n*m)
    {
        flag=1;
        for(int j=1;j<=m;j++)
        {
            if((dis[edge[j].a]-edge[j].cab)*edge[j].rab>dis[edge[j].b])
            {
                dis[edge[j].b]=(dis[edge[j].a]-edge[j].cab)*edge[j].rab;
                flag=0;
            }
             if((dis[edge[j].b]-edge[j].cba)*edge[j].rba>dis[edge[j].a])
            {
                dis[edge[j].a]=(dis[edge[j].b]-edge[j].cba)*edge[j].rba;
                flag=0;
            }
        }
        if(flag==1)
            return 0;
    }
    return 1;
}
int main()
{
    while(scanf("%d%d%d%lf",&n,&m,&s,&v)!=EOF)
    {
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&edge[i].a,&edge[i].b);
            scanf("%lf%lf%lf%lf",&edge[i].rab,&edge[i].cab,&edge[i].rba,&edge[i].cba);
        }
        if(bellman())
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}