登 录
应用bellman_ford算法,求最长路。
相较于标准bellman_ford,写法上,有一点点的改变,即松弛条件变为当没有增值的时候,进行松弛。
但为了防止出现没有增值,也没有点可松弛的时候,记得当没有边松弛的时候,就必须判断并返回。
#include<stdio.h> #include<string.h> #define esp 1e-8 struct node { int u,v; double r,c; }e[500]; int n,m,s,index; double source; double d[200],flag; double bellman() { int i,j,k; memset(d,0.0,sizeof(d)); d[s]=source; while(d[s]<=source+esp) { flag=1; for(i=0;i<index;i++) { if(d[e[i].v]+esp<(d[e[i].u]-e[i].c)*e[i].r ) { d[e[i].v]=(d[e[i].u]-e[i].c)*e[i].r; flag=0; } } if(flag) { return d[s]-source; } } return 1; } int main() { int i,a,b; double r1,c1,r2,c2; scanf("%d%d%d%lf",&n,&m,&s,&source); index=0; for(i=0;i<m;i++) { scanf("%d%d%lf%lf%lf%lf",&a,&b,&r1,&c1,&r2,&c2); e[index].u=a;e[index].v=b;e[index].r=r1;e[index].c=c1; e[++index].u=b;e[index].v=a;e[index].r=r2;e[index].c=c2; index++; } if(bellman()) printf("YES/n"); else printf("NO/n"); return 0; }
抱歉!评论已关闭.