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 }