【Codevs1183】泥泞的道路

Position:


List

  • Codevs1183 泥泞的道路

    • List
    • Description
    • Input
    • Output
    • Sample Input
    • Sample Output
    • HINT
    • Solution
    • Code

Description

CS有n个小区,并且任意小区之间都有两条单向道路(a到b,b到a)相连。因为最近下了很多暴雨,很多道路都被淹了,不同的道路泥泞程度不同。小A经过对近期天气和地形的科学分析,绘出了每条道路能顺利通过的时间以及这条路的长度。

现在小A在小区1,他希望能够很顺利地到达目的地小区n,请帮助小明找出一条从小区1出发到达小区n的所有路线中(总路程/总时间)最大的路线。请你告诉他这个值。

Input

第一行包含一个整数n,为小区数。

接下来n*n的矩阵P,其中第i行第j个数表示从小区i到小区j的道路长度为Pi,j。第i行第i个数的元素为0,其余保证为正整数。

接下来n*n的矩阵T,第i行第j个数表示从小区i到小区j需要的时间Ti,j。第i行第i个数的元素为0,其余保证为正整数。

Output

写入一个实数S,为小区1到达n的最大答案,S精确到小数点后3位。

Sample Input

3

0 8 7

9 0 10

5 7 0

0 7 6

6 0 6

6 2 0

Sample Output

2.125

HINT

【数据说明】

30%的数据,n<=20

100%的数据,n<=100,p,t<=10000

Solution

直接跑最短路记录v是错误的,后效性,就像两个溶液,c1+c2大,不一定混合就大(可能一个v很大)

对于这种分数题,很直接想到二分答案

∑p/∑t>ans(check满足),移过去,拆开,p[i]>ans×t[i],p[i]-ans×t[i]>0,以p[i]-ans×t[i]为关键字跑1~n的最长路即可(注意判断正权环)

Code

 1 // This file is made by YJinpeng,created by XuYike‘s black technology automatically.
 2 // Copyright (C) 2016 ChangJun High School, Inc.
 3 // I don‘t know what this program is.
 4
 5 #include <iostream>
 6 #include <vector>
 7 #include <algorithm>
 8 #include <cstring>
 9 #include <cstdio>
10 #include <cstdlib>
11 #include <cmath>
12 #include <queue>
13 #define MOD 1000000007
14 #define INF 1e9
15 #define EPS 1e-5
16 using namespace std;
17 typedef long double LB;
18 const int MAXN=110;
19 const int MAXM=100010;
20 inline int gi() {
21     register int w=0,q=0;register char ch=getchar();
22     while((ch<‘0‘||ch>‘9‘)&&ch!=‘-‘)ch=getchar();
23     if(ch==‘-‘)q=1,ch=getchar();
24     while(ch>=‘0‘&&ch<=‘9‘)w=w*10+ch-‘0‘,ch=getchar();
25     return q?-w:w;
26 }
27 int p[MAXN][MAXN],t[MAXN][MAXN],num[MAXN];
28 queue<int>q;LB d[MAXN];int n;bool u[MAXN];
29 bool check(LB k){
30     for(int i=1;i<=n;i++)d[i]=-1e16;
31     q.push(1);d[1]=0;memset(u,0,sizeof(u));memset(num,0,sizeof(num));
32     while(!q.empty()){
33         int x=q.front();q.pop();u[x]=0;
34         for(int o=1;o<=n;o++)
35             if(o!=x)
36                 if(d[x]+p[x][o]-t[x][o]*k>d[o]){
37                     d[o]=d[x]+p[x][o]-t[x][o]*k;
38                     if(!u[o])u[o]=1,q.push(o),num[o]++;
39                     if(num[o]>n)return true;
40                 }
41     }
42     return d[n]>=0;
43 }
44 int main()
45 {
46     freopen("1183.in","r",stdin);
47     freopen("1183.out","w",stdout);
48     n=gi();
49     for(int i=1;i<=n;i++)
50         for(int j=1;j<=n;j++)
51             p[i][j]=gi();
52     for(int i=1;i<=n;i++)
53         for(int j=1;j<=n;j++)
54             t[i][j]=gi();
55     LB l=0,r=INF;
56     while(r-l>EPS){
57         LB m=(l+r)/2.0;
58         if(check(m))l=m;
59         else r=m;
60     }printf("%.3lf",double(r));
61     return 0;
62 }
时间: 2024-10-12 13:32:20

【Codevs1183】泥泞的道路的相关文章

codevs1183 泥泞的道路

题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路(a到b,b到a)相连.因为最近下了很多暴雨,很多道路都被淹了,不同的道路泥泞程度不同.小A经过对近期天气和地形的科学分析,绘出了每条道路能顺利通过的时间以及这条路的长度. 现在小A在小区1,他希望能够很顺利地到达目的地小区n,请帮助小明找出一条从小区1出发到达小区n的所有路线中(总路程/总时间)最大的路线.请你告诉他这个值. 输入描述 Input Description 第一行包含一个整数n,为小区数. 接下来n

codevs1183泥泞的道路

SPFA+二分答案 开始做的时候,想直接跑图论,后来发现好像不对(不然数据范围怎么这么小) 但是显然要用到图论,机智的我就想到了二分答案. 考虑,假如有一个ans,那么如果存在length i / time i >=ans(i属于路径上的边),那么显然更优 ,则可发现问题可转换为如果一个答案更优,那么对于以 length i?ans*time i 为权值,重新构的图中,如果到达n的最长路不小于n,显然答案可以更优,只需要二分答案就可以了.另外如果有正权环显然是可以的   唯独要注意的是,精度要求

TYVJ P1577 泥泞的道路

题目链接:http://www.tyvj.cn/p/1577# P1577 泥泞的道路 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 公园中有n个景点,编号1~n,并由m条双向道路相连.由于昨天下雨,导致公园中的马路泥泞不堪,每条道路都有一个泥泞程度w.现有Q个游客依次向你求 助,想从景点X走到景点Y,他希望找到一条道路,使得经过道路泥泞程度的最大值尽量小.你能设计一个在线算法,帮他们找到方案吗? 输入格式 第一行两个正整数n和m,表示景点数和道路数.

1183 泥泞的道路

1183 泥泞的道路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路(a到b,b到a)相连.因为最近下了很多暴雨,很多道路都被淹了,不同的道路泥泞程度不同.小A经过对近期天气和地形的科学分析,绘出了每条道路能顺利通过的时间以及这条路的长度. 现在小A在小区1,他希望能够很顺利地到达目的地小区n,请帮助小明找出一条从小区1出发到达小区n的所有路线中(总路程

codevs 1183 泥泞的道路

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路(a到b,b到a)相连.因为最近下了很多暴雨,很多道路都被淹了,不同的道路泥泞程度不同.小A经过对近期天气和地形的科学分析,绘出了每条道路能顺利通过的时间以及这条路的长度. 现在小A在小区1,他希望能够很顺利地到达目的地小区n,请帮助小明找出一条从小区1出发到达小区n的所有路线中(总路程/总时间)最大的路线.请你告诉他这个值.

泥泞的道路

[题目描述] 有n个小区,并且任意小区之间都有两条单向道路(a到b,b到a)相连.因为最近下了很多暴雨,很多道路都被淹了,不同的道路泥泞程度不同.经过对近期天气和地形的科学分析,绘出了每条道路能顺利通过的时间以及这条路的长度. 现在某人在小区1,他希望能够很顺利地到达目的地小区n,请帮助他找出一条从小区1出发到达小区n的所有路线中(总路程/总时间)最大的路线,并告诉他这个值. [输入描述] 第一行包含一个整数n,为小区数. 接下来n*n的矩阵P,其中第i行第j个数表示从小区i到小区j的道路长度为

成功更容易光顾磨难和艰辛,正如只有经过泥泞的道路才会留下脚印

更新一下今天的学习进度:以后每天都会更新,倘若有啥感悟想说的话也会一起发出来,希望更多的人能和我一起坚持下去: 1.每天背诵50个英文单词,复习巩固了68个单词,进度:  1050/3486 2.<王者归来>两个月内读完,进度:395/1010 3.<人类简史>,进度:218/452

codevs 1183 泥泞的道路 (二分+SPFA+差分约束)

/* 二分答案(注意精度) 对于每一个答案 有(s1+s2+s3...)/(t1+t2+t3...)>=ans 时符合条件 这时ans有变大的空间 对于上述不等式如果枚举每一条路显得太暴力 化简一下变成 :s1-t1*ans+s2-t2*ans+s3-t3*ans...>=0 差分约束跑最长路 如果dis[n]>0 或者有正环 (开始这个忘掉了)ans就合法 */ #include<iostream> #include<cstdio> #include<cs

[codevs 1183][泥泞的道路(二分+spfa)

题目:http://dev.codevs.cn/problem/1183/ 分析:这个和最优比率生成树很像,都可以二分答案的,只不过判定方面一个是求是否有最短路径,一个是求是否有生成树.假设等待判定的是ans,那么我们可以把每条边的边权改成s[i][j]-ans*t[i][j],然后跑最长路.如果d[n]>=0,那么肯定就说明这个ans是可行的.但是要注意有可能最长路的时候可能出现正权环,那么可以脑补以下,无论是否环中是否包含n,但都可以多走这环几次使得目前的d很大很大,以至于走了一些负边到n时