codevs1183 泥濘的道路

2022-08-23 04:15:13 字數 2427 閱讀 1851

題目描述 description

cs有n個小區,並且任意小區之間都有兩條單向道路(a到b,b到a)相連。因為最近下了很多暴雨,很多道路都被淹了,不同的道路泥濘程度不同。小a經過對近期天氣和地形的科學分析,繪出了每條道路能順利通過的時間以及這條路的長度。

現在小a在小區1,他希望能夠很順利地到達目的地小區n,請幫助小明找出一條從小區1出發到達小區n的所有路線中(總路程/總時間)最大的路線。請你告訴他這個值。

輸入描述 input description

第一行包含乙個整數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 description

寫入乙個實數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

資料範圍及提示 data size & hint

【資料說明】

30%的資料,n<=20

100%的資料,n<=100,p,t<=10000

分析:

一開始以為是一道dp

想起了這道題

但是這個t的範圍好大

列舉不就jj了嗎

那怎麼辦呢

tag上說是二分

第一反應,二分時間

看在mid的時間內能夠走到**

能到達n的話,就統計一下答案,r=mid

不能的話l=mid

但是我們不能保證這樣就具有單調性啊(二分的要求就是答案具有單調性)

況且二分t的範圍不也是很大嗎,zz

那我們還能二分什麼呢

只能二分最大值了

那問題就在如何判定可行性上

(s1+s2+s3)/(t1+t2+t3)=ans

難道我們要走一步看一步嘛

太不現實了

想到這裡,就體現了oi們必須具備的乙個重要思想

(s1+s2+s3)=ans*(t1+t2+t3)

s1+s2+s3=ans*t1+ans*r2+ans*t3

(s1-ans*t1)+(s2-ans*t2)+(s3-ans*t3)=0

這樣一看,ans就和我們經過的每一條邊都有直接關係了

我們可以把邊權變成s-ans*t

每次跑乙個最長路

看一看答案是不是》0

是則l=mid

否則r=mid

每一種元素都要嘗試一下,

熟練掌握畫柿子的本領

等我第一遍寫完之後,怎麼也跑不出來答案,

後來看前輩在spfa的時候有乙個特判

ti[way[i].y]++;

if (ti[way[i].y]>=n) return

1;

這個是判斷環的

ti表示每個元素的入隊次數,如果乙個點的入隊次數大於等於n,那麼ta一定在乙個環上,如果存在正環,那麼一定符合條件

這裡寫**片

#include

#include

#include

#include

using

namespace

std;

const

int n=102;

const

double eps=1e-4;

const

double inf=1e7;

int mp[n][n],t[n][n];

int n,sum=0;

struct node;

node way[2*n*n];

int st[n],tot;

double dis[n];

int q[n*n],tou,wei,ti[n];

bool p[n];

int dcmp(double x)

void add(int u,int w,double z)

int spfa()}}

p[r]=1;

}while (touif (dis[n]>=0) return

1; else

return0;}

int pd(double mid)

return spfa();

}void erfen()

printf("%0.3lf",ans);

}int main()

Codevs 1183 泥濘的道路

1183 泥濘的道路 時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond 傳送門題目描述 description cs有n個小區,並且任意小區之間都有兩條單向道路 a到b,b到a 相連。因為最近下了很多暴雨,很多道路都被淹了,不同的道路泥濘程度不同。小a經過對近期天氣和地...

Codevs 1183 泥濘的道路

1183 泥濘的道路 時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond 題解 檢視執行結果 題目描述 description cs有n個小區,並且任意小區之間都有兩條單向道路 a到b,b到a 相連。因為最近下了很多暴雨,很多道路都被淹了,不同的道路泥濘程度不同。小a經過...

codevs1183泥濘的道路

題意 給定一張有向稠密圖和通過每條邊的時間和路程,問從1到n的路程 時間 最大為多少 正解 spfa 二分答案 開始做的時候,想直接跑圖論,後來發現好像不對 不然資料範圍怎麼這麼小 但是顯然要用到圖論,機智的我就想到了二分答案。考慮,假如有乙個ans,那麼如果存在length i time i an...