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;
}