codevs 1183 泥泞的道路 二分+SPFA最长路
題目描述 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
#include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std; const int MAXN = 233; int p[MAXN][MAXN], t[MAXN][MAXN],c[MAXN], n; double d[MAXN], f[MAXN][MAXN]; bool used[MAXN]; queue < int > q;bool spfa(int s) {memset(d, -0x3f, sizeof(d));memset(used, 0, sizeof(used));memset(c, 0, sizeof(c));d[s] = 0;q.push(s);used[s] = 1;while(!q.empty()){int u = q.front();q.pop();for(int i = 1; i <= n; i++){if(p[u][i] && d[u] + f[u][i] > d[i]){d[i] = d[u] + f[u][i];if(!used[i]){q.push(i);used[i] = 1;c[i]++;if(c[i] > n)return true;}}}used[u] = 0;}if(d[n] > 0)return true;return false; }bool check(double mid) {memset(f, 0, sizeof(f));for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)f[i][j] = p[i][j] - mid * t[i][j];if(spfa(1))return true;return false; }int main() {scanf("%d", &n);for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)scanf("%d", &p[i][j]);for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)scanf("%d", &t[i][j]);double l = 0, r = 100000;double jd = 0.0001;while(r - l > jd){double mid = (l + r) /2;if(check(mid))l = mid;elser = mid;}printf("%.3lf", l);return 0; }轉載于:https://www.cnblogs.com/Loi-Vampire/p/6017062.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的codevs 1183 泥泞的道路 二分+SPFA最长路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下用来获取各种系统信息的C++
- 下一篇: Cocos2d-x游戏中默认的Andro