codevs1183 泥泞的道路

codevs1183 泥泞的道路
分数规划+二分答案(小数)
一般是把移项之后的进行从大到小排序,但在这里要跑最长路,这和排序的道理是一样的,不过要同时满足最大和联通两个条件

求最长路的时候不要忘记判正环23333333

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<ctime>
 7 #include<set>
 8 #include<map>
 9 #include<stack>
10 #include<cstring>
11 #define inf 2147483647
12 #define ls rt<<1
13 #define rs rt<<1|1
14 #define lson ls,nl,mid,l,r
15 #define rson rs,mid+1,nr,l,r
16 #define N 100010
17 #define For(i,a,b) for(int i=a;i<=b;i++)
18 #define p(a) putchar(a)
19 #define g() getchar()
20 
21 using namespace std;
22 int n;
23 long double d[110][110],t[110][110],f[110][110];
24 long double l,r,mid,ans;
25 void in(int &x){
26     int y=1;
27     char c=g();x=0;
28     while(c<'0'||c>'9'){
29         if(c=='-')y=-1;
30         c=g();
31     }
32     while(c<='9'&&c>='0'){
33         x=(x<<1)+(x<<3)+c-'0';c=g();
34     }
35     x*=y;
36 }
37 void o(int x){
38     if(x<0){
39         p('-');
40         x=-x;
41     }
42     if(x>9)o(x/10);
43     p(x%10+'0');
44 }
45 
46 bool check(long double x){
47     For(i,1,n)
48         For(j,1,n){
49             f[i][j]=d[i][j]-x*t[i][j];
50         }
51     For(k,1,n)
52         For(i,1,n)
53             For(j,1,n)
54                  f[i][j]=max(f[i][j],f[i][k]+f[k][j]);    
55     For(i,1,n){
56         if(f[i][i]>0)
57             return true;
58     }
59     return f[1][n]>=0;             
60 }
61 
62 int main(){
63     in(n);
64     For(i,1,n)
65       For(j,1,n)
66         cin>>d[i][j];
67     For(i,1,n)
68       For(j,1,n)
69         cin>>t[i][j];
70    l=0;r=100000000.0;
71     while(r-l>1e-6){
72         mid=(l+r)/2.0;
73         if(check(mid))
74             l=mid;
75         else
76             r=mid;
77     }
78     printf("%.3Lf",r);
79     return 0;
80 }
View Code

 

posted @ 2019-01-26 11:44  WeiAR  阅读(226)  评论(0编辑  收藏  举报