zoukankan      html  css  js  c++  java
  • 小澳的葫芦-二分答案-01分数规划-spfa

    Description

      小澳最喜欢的歌曲就是《葫芦娃》。
      一日表演唱歌,他尽了洪荒之力,唱响心中圣歌。
      随之,小澳进入了葫芦世界。
      葫芦世界有n个葫芦,标号为1~ n。n个葫芦由m条藤连接,每条藤连接了两个葫芦,这些藤构成了一张有向无环图。小澳爬过每条藤都会消耗一定的能量。
      小澳站在1号葫芦上(你可以认为葫芦非常大,可以承受小澳的体重),他想沿着藤爬到n号葫芦上,其中每个葫芦只经过一次。
      小澳找到一条路径,使得消耗的能量与经过的葫芦数的比值最小。

    Input

      输入文件名为calabash.in。
      输入文件第一行两个正整数n,m,分别表示葫芦的个数和藤数。
      接下来m行,每行三个正整数u,v,w,描述一条藤,表示这条藤由u连向v,小澳爬过这条藤需要消耗w点能量。

    Output

      输出文件名为calabash.out。
      一行一个实数,表示答案(误差不超过 10^-3)。

    Sample Input

    4 6
    1 2 1
    2 4 6
    1 3 2
    3 4 4
    2 3 3
    1 4 8

    Sample Output

    2.000

    Hint

    n<=200,m<=2000


    思路

    • 消耗的能量与经过的葫芦数的比值最小,01分数规划套路
    • 二分答案+图的最短路(用spfa,有负边权)

    代码

    #include <iostream>
    #include <cstdio>
    #include <queue>
    #include <iomanip>
    using namespace std;
    const double eps=1e-5;
    int n,m,head[205],cnt;
    bool vis[205];
    double dis[205];
    struct fdfdfd{int to,next;double w,val;}e[2005];
    void addedge(int x,int y,double z){e[++cnt]=(fdfdfd){y,head[x],0,z}; head[x]=cnt;}
    bool spfa(double lim)
    {
    	queue<int> q;
    	for(int i=1;i<=n;++i) dis[i]=0x7fffffff;
    	for(int i=1;i<=cnt;++i) e[i].w=e[i].val-lim; dis[1]=-lim; vis[1]=1; q.push(1);
    	while(!q.empty())
    	{
    		int x=q.front(); vis[x]=0; q.pop();
    		for(int i=head[x];i;i=e[i].next)
    		{
    			int v=e[i].to;
    			if(dis[v]>dis[x]+e[i].w)
    			{
    				dis[v]=dis[x]+e[i].w;
    				if(!vis[v]) vis[v]=1,q.push(v);
    			}
    		}
    	}
    	return dis[n]<0;
    }
    int main()
    {
    	scanf("%d%d",&n,&m);
    	double left=0,right=0;
    	for(int i=1,x,y,z;i<=m;++i) scanf("%d%d%d",&x,&y,&z),addedge(x,y,z),right=max(right,(double)z);
    	cout<<fixed<<setprecision(3);
    	while(left+eps<right)
    	{
    		double mid=(left+right)*0.5;
    		if(spfa(mid)) right=mid;
    		else left=mid;
    	}
    	cout<<fixed<<setprecision(3)<<left<<'
    ';
    	return 0;
    }
    
  • 相关阅读:
    NSURLSessionDataDelegate 文件下载
    NSURLConnection 大文件下载
    全屏滑动
    qq粒子效果
    iOS 技巧
    iOS 15 新特性适配
    iOS 字符串转json 字符串转数组
    iOS 微信分享显示未验证应用2
    iOS 微信分享显示未验证应用1
    iOS 隐藏系统音量提示框
  • 原文地址:https://www.cnblogs.com/wuwendongxi/p/14044175.html
Copyright © 2011-2022 走看看