最小密度路径

原题:zjnu 1323

题意

在最短路的基础上加上了路的段数的要求,所以我们加上一维h,用dis[i][j][h]表示i到j走h条路时的最短路,ans枚举1~n即可

因为n比较小而q比较大,所以用floyd一次性算出来比较省事

代码

#include
#include
#define N 59
#include
using namespace std;


int c[N][N],dis[N][N][N];
int main(){
    int n,m;scanf("%d%d",&n,&m);
    memset(c,125,sizeof(c));
    memset(dis,125,sizeof(dis));
    int MAX=c[0][0];
    while(m--){
        int a,b,v;scanf("%d%d%d",&a,&b,&v);
        if(vfor(int i=1;i<=n;i++)dis[i][i][0]=0;
    for(int h=1;h<=n;h++){//写在第一个for循环内
        for(int k=1;k<=n;k++){
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    if(dis[i][k][h-1]==MAX||c[k][j]==MAX)continue;
                    dis[i][j][h]=min(dis[i][j][h],dis[i][k][h-1]+c[k][j]);
                }
            }
        }
    }
    int q;scanf("%d",&q);
    while(q--){
        double ans=(double)MAX;
        int a,b;scanf("%d%d",&a,&b);
        int flag=0;
        for(int i=1;i<=n;i++){
            if(dis[a][b][i]>=MAX)continue;
            flag=1;
            ans=min(ans,dis[a][b][i]*1.0/i);
        }
        if(!flag)printf("OMG!\n");
        else printf("%.3f\n",ans);
    }
}

你可能感兴趣的:(图论/搜索)