• bzoj 1690: [Usaco2007 Dec]奶牛的旅行【01分数规划+spfa】


    把add传参里的double写成int我也是石乐志……
    首先这个东西长得就很01分数规划
    然后我不会证为什么没有8字环,我们假装他没有
    那么设len为环长

    [ans leq frac{sum_{i=1}^{len}f_i}{sum_{i=1}^{len}t_i} ]

    [ans*sum_{i=1}^{len}t_i leq sum_{i=1}^{len}f_i ]

    [sum_{i=1}^{len}ans*t_i-f_i leq 0 ]

    二分这个ans,把每条边的边权赋值成( ans*t_i-f_i )fi是i这条边的起点点权或者终点点权都可以
    然后用dfs版的spfa找正环来判断当前ans的可行性

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    const int N=1005,M=5005;
    const double eps=1e-5;
    int n,m,h[N],cnt,x[M],y[M];
    double a[N],z[M],dis[N];
    bool f,v[N];
    struct qwe
    {
    	int ne,to;
    	double va;
    }e[M];
    int read()
    {
    	int r=0,f=1;
    	char p=getchar();
    	while(p>'9'||p<'0')
    	{
    		if(p=='-')
    			f=-1;
    		p=getchar();
    	}
    	while(p>='0'&&p<='9')
    	{
    		r=r*10+p-48;
    		p=getchar();
    	}
    	return r*f;
    }
    void add(int u,int v,double w)
    {
    	cnt++;
    	e[cnt].ne=h[u];
    	e[cnt].to=v;
    	e[cnt].va=w;
    	h[u]=cnt;
    }
    void spfa(int u)
    {
    	if(f)
    		return;
    	v[u]=1;
    	for(int i=h[u];i&&!f;i=e[i].ne)
    		if(dis[e[i].to]<dis[u]+e[i].va)
    		{
    			dis[e[i].to]=dis[u]+e[i].va;
    			if(v[e[i].to])
    			{
    				f=1;
    				return;
    			}
    			else
    				spfa(e[i].to);
    		}
    	v[u]=0;
    }
    bool ok(double mid)
    {
    	cnt=0;f=0;
    	memset(h,0,sizeof(h));
    	memset(v,0,sizeof(v));
    	memset(dis,0,sizeof(dis));
    	for(int i=1;i<=m;i++)
    		add(x[i],y[i],a[x[i]]-mid*z[i]);
    	for(int i=1;i<=n;i++)
    	{
    		spfa(i);
    		if(f)
    			return 1;
    	}
    	return 0;
    }
    int main()
    {
    	n=read(),m=read();
    	for(int i=1;i<=n;i++)
    		a[i]=read();
    	for(int i=1;i<=m;i++)
    		x[i]=read(),y[i]=read(),z[i]=read();
    	double l=0,r=1e6,ans=0;
    	while(r-l>eps)
    	{
    		double mid=(l+r)/2.0;
    		if(ok(mid))
    			l=mid,ans=mid;
    		else
    			r=mid;
    	}
    	printf("%.2lf
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    日报 18/07/10
    meta标签
    map 和 vector 的erase函数说明
    Intel CPU MMX SSE SSE2/3/4指令集手册下载URL
    关于c中 int, float, double转换中存在的精度损失问题
    c++ 常数后缀说明
    STL中容器的push()或者push_back()函数的一点说明
    fprintf, fscanf,printf,scanf使用时参数注意
    操作系统 庞丽萍 第七章
    辨析全局变量的声明与定义
  • 原文地址:https://www.cnblogs.com/lokiii/p/8982123.html
Copyright © 2020-2023  润新知