为什么每次dfs不需要初始化dis数组???
//最大比率问题:01分数规划
#include<bits/stdc++.h>
using namespace std;
int n,m,idx;
int head[100010],vis[100010];
double f[100010],dis[100010];
struct node{
int nxt,to;
double w;
}edge[100010];
void add(int u,int v,double w)
{
edge[++idx].nxt=head[u];
edge[idx].to=v;
edge[idx].w=w;
head[u]=idx;
}
bool spfa(int x,double mid)//dfs版spfa
{
vis[x]=1;
for(int i=head[x];i;i=edge[i].nxt)
{
int y=edge[i].to;
if(dis[x]+edge[i].w*mid-f[x]<dis[y])
{
dis[y]=dis[x]+edge[i].w*mid-f[x];
if(vis[y]||spfa(y,mid))
{
vis[x]=0;
return 1;
}
}
}
vis[x]=0;
return 0;
}
bool check(double mid)
{
for(int i=1;i<=n;i++)
{
if(spfa(i,mid))
return 1;
}
return 0;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
scanf("%lf",&f[i]);
}
for(int i=1;i<=m;i++)
{
int u,v;
double w;
scanf("%d%d%lf",&u,&v,&w);
add(u,v,w);
}
double l=0,r=1000000;
while(r-l>0.0000001)
{
double mid=(l+r)/2.0;
if(check(mid))
l=mid;
else r=mid;
}
printf("%.2lf",l);
return 0;
}