1 条题解
-
0
C++ :
#include<bits/stdc++.h> using namespace std; #define mem(a,n) memset(a,n,sizeof(a)) const double INF=0x3f3f3f3f+1.0; const double eps=1e-6; typedef long long LL; const int N=105; double d[N][N],t; int C,R,t1,tmp,t2; struct Edge { int u,to; double v,a; }; queue<Edge>que; void floyd() { for(int k=1;k<=C;k++)for(int i=1;i<=C;i++)for(int j=1;j<=C;j++)if(d[i][j]>d[i][k]+d[k][j])d[i][j]=d[i][k]+d[k][j]; } double solve(double sum) { Edge tou; while(!que.empty()) { tou=que.front();que.pop(); t=0; if(abs(tou.a-1)>eps)t=log(tou.v*log(tou.a))/log(tou.a);t=max(t,d[1][tou.u]); sum=min(sum,t+tou.v*pow(tou.a,-t)+d[tou.to][C]); } return sum; } int main() { while(~scanf("%d%d",&C,&R)&&C&&R) { while(!que.empty())que.pop(); for(int i=1;i<=C;i++) for(int j=1;j<=C;j++) if(i==j)d[i][i]=0; else d[i][j]=INF; Edge E; for(int i=0;i<R;i++) { scanf("%d%d%lf%lf",&E.u,&E.to,&E.v,&E.a);t1=E.u,t2=E.to;d[t1][t2]=E.v;d[t2][t1]=E.v;que.push(E); tmp=E.u;E.u=E.to;E.to=tmp;que.push(E); } floyd(); double ans=d[1][C]; printf("%.3lf\n",solve(ans)); } return 0; }
- 1
信息
- ID
- 1932
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者