神奇
查看原帖
神奇
250699
mot1ve楼主2020/10/22 15:18

为什么每次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;
}
2020/10/22 15:18
加载中...