为什么分层图最短路过不了,DP就行?

Dijksrta试过了,SPFA也试过了,就是WA,到底是不能用分层图最短路还是其他地方有什么问题(比如精度问题)?

#include <bits/stdc++.h>
using namespace std ;
const int maxN=55 , maxM=1005 ;
#define int long long
#define inf 0x3f3f3f3f3f3f3f3f

vector<array<int,2>> g[maxN] ;
int dist[maxN][maxN][maxM] ;
double ans[maxN][maxN] ;
bool vis[maxN][maxM] ;
int n , m ;    

void SPFA(int s) {
    memset(dist[s], 0x3f, sizeof(dist[s])) ;
    memset(vis, false, sizeof(vis)) ;
    queue<array<int,2>> que ;
    dist[s][s][0] = 0 ;
    que.push({s,0}) ;    vis[s][0] = true ;
    while(!que.empty()) {
        int u = que.front()[0] , cnt = que.front()[1] ;    que.pop() ;
        vis[u][cnt] = false ;
        if(cnt>=m)    continue ;
        for(auto &[v,w]:g[u]) {
            if(dist[s][v][cnt+1] > dist[s][u][cnt]+w) {
                dist[s][v][cnt+1] = dist[s][u][cnt] + w ;
                if(!vis[v][cnt+1])  {
                    que.push({v,cnt+1}) ;
                    vis[v][cnt+1] = true ;
                }
            }
        }
    }
}

signed main() {
    cin >> n >> m ; 
    for(int i=1 ; i<=m ; i++) {
        int u , v , w ;    cin >> u >> v >> w ;
        g[u].push_back({v,w}) ;
    }
    for(int s=1 ; s<=n ; s++) 
        SPFA(s) ;
    for(int s=1 ; s<=n ; s++) {
        for(int t=1 ; t<=n ; t++) {
            ans[s][t] = 1e18 ;
            for(int k=1 ; k<=m ; k++) {
                if(dist[s][t][k]==inf)    continue ;
                ans[s][t] = min(ans[s][t], ((double)1.0)*dist[s][t][k]/k) ;
            }
        }
    }
    int q ;    cin >> q ;
    while(q--) {
        int x , y ;    cin >> x >> y ;
        if(ans[x][y]>=1e16)    cout << "OMG!" << endl ;
        else printf("%.10lf\n", ans[x][y]) ;
    } 
    return 0 ; 
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务