CSU 1806: Toll

来源:互联网 发布:太平天国知乎 编辑:程序博客网 时间:2024/05/29 17:18

求对最短路的0~T时间段里的积分,用(自适应辛普森)

#include"cmath"#include"queue"#include"cstdio"#include"cstring"#include"iostream"#include"algorithm"using namespace std;const double eps = 1e-8;const int MX = 15;const int INF = 1<<30;int n,m,T;int c[MX][MX],d[MX][MX];bool vis[MX];double dis[MX];double f(double t){    memset(vis,0,sizeof(vis));    for(int i = 1; i<= n; i++)        dis[i] = INF;    dis[1] = 0;    queue<int> q;    q.push(1);    while(q.size()){        int u = q.front();        q.pop();        vis[u] = 0;        for(int i = 1; i <= n; i++){            int v = i;            if(dis[v]-eps > dis[u] + c[u][i]*t+d[u][i]){                dis[v] = dis[u] + c[u][i]*t+d[u][i];                if(vis[v]) continue;                q.push(v);                vis[v] = 1;            }        }    }    return dis[n];}double simpson(double l, double r){    return (r-l)/6*(f(l) + 4*f((l+r)/2) + f(r));}double solve(double l, double r){    double mid = (l+r)/2, now = simpson(l,r);    if(fabs(simpson(l,mid) + simpson(mid,r) - now) < eps) return now;    else return solve(l,mid) + solve(mid,r);}int main(){    int x,y;    while(~scanf("%d%d%d",&n,&m,&T)){        memset(c,0x3f,sizeof(c));        memset(d,0x3f,sizeof(d));        for(int i = 1; i<= m; i++){            scanf("%d%d",&x,&y);            scanf("%d%d",&c[x][y],&d[x][y]);        }        printf("%.8lf\n",solve(0,T)/T);    }    return 0;}


原创粉丝点击