日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

泥泞的道路

發布時間:2023/12/24 综合教程 26 生活家
生活随笔 收集整理的這篇文章主要介紹了 泥泞的道路 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

時間限制: 1 s 空間限制: 128000 KB 題目等級 : 鉆石 Diamond

題目描述 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

087

9010

570

076

606

620

樣例輸出 Sample Output

2.125

數據范圍及提示 Data Size & Hint

【數據說明】

30%的數據,n<=20

100%的數據,n<=100,p,t<=10000

思路:二分答案+單源最短路(SPFA判負權回路)

代碼實現:

 1 #include<cstdio>
 2 #include<cstring>
 3 const int maxn=110;
 4 const int maxm=maxn*maxn;
 5 int n,a;
 6 int ns[maxn][maxn],nt[maxn][maxn];
 7 int h[maxn],hs=1;
 8 int e_s[maxm<<2],e_n[maxm<<2];
 9 double e_f[maxm<<2];
10 double l,r,mid,error=1e-4;
11 int s[maxn],q[maxm<<2],head,tail;
12 double d[maxn];
13 bool SPFA(){
14     for(int i=1;i<=n;i++) d[i]=1e8;
15     memset(s,0,sizeof(s));
16     head=tail=0;
17     q[head++]=1,d[1]=0;
18     while(head>tail){
19         a=q[tail++];
20         for(int i=h[a];i;i=e_n[i])
21         if(d[a]+e_f[i]<d[e_s[i]]){
22             d[e_s[i]]=d[a]+e_f[i];
23             q[head++]=e_s[i];
24             ++s[e_s[i]];
25             if(s[e_s[i]]==n) return false;
26         }
27     }
28     return true;
29 }
30 int main(){
31     scanf("%d",&n);
32     for(int i=1;i<=n;i++)
33     for(int j=1;j<=n;j++)
34     scanf("%d",&ns[i][j]);
35     for(int i=1;i<=n;i++)
36     for(int j=1;j<=n;j++)
37     scanf("%d",&nt[i][j]);
38     l=0,r=1e4;
39     while(r-l>error){
40         memset(h,0,sizeof(h)),hs=1;
41         mid=(l+r)/2;
42         for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(i!=j) ++hs,e_s[hs]=j,e_n[hs]=h[i],e_f[hs]=-ns[i][j]+nt[i][j]*mid,h[i]=hs;
43         if(SPFA()&&d[n]>0) r=mid;
44         else l=mid;
45     }
46     printf("%.3lf",l);
47     return 0;
48 }

不太會判負權回路,我其實過去一直偏向使用Dijkstra。

總結

以上是生活随笔為你收集整理的泥泞的道路的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。