zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    [C#]App.Config
    [转][JS]修改链接中的参数
    [转][Oracle]常见报错及处理
    [转]截图软件分享
    [转][C#]手写 Socket 服务端
    3.6的pprint写法改变了:pprint.pprint()
    版本优化-test
    python爬取豆瓣小组700+话题加回复啦啦啦python open file with a variable name
    爬豆瓣被封的解决方案
    去除列表中字符串中的空格换行等
  • 原文地址:https://www.cnblogs.com/lokiii/p/8982123.html
Copyright © 2011-2022 走看看