百度地圖的實時路況


百度地圖的實時路況功能相當強大,能方便出行的人們避開擁堵路段。一個地區的交通便捷程度就決定了該地區的擁堵情況。假設一個地區有 nn 個觀測點,編號從 11 到 nn。定義 d(u,v,w)d(u,v,w) 為從 uu 號點出發,嚴格不經過 vv 號點,最終到達 ww 號點的最短路徑長度,如果不存在這樣的路徑,d(u,v,w)d(u,v,w) 的值為 -11。

那么這個地區的交通便捷程度 PP 為:

 

P = \sum_{1 \leq x,y,z \leq n , x \neq y , y \neq z}{d(x,y,z)}P=1x,y,zn,x=y,y=zd(x,y,z)

 

現在我們知道了該地區的 nn 個點,以及若干條有向邊,求該地區的交通便捷程度 PP。

輸入格式

第一行輸入一個正整數 n(4 \leq n \leq 300)n(4n300),表示該地區的點數。

接下來輸入 nn 行,每行輸入 nn 個整數。第 ii 行第 jj 個數 G_{i,j}(-1 \leq G_{i,j} \leq 10000;G_{i,i} = 0)Gi,j(1Gi,j10000;Gi,i=0) 表示從 ii 號點到 jj 號的有向路徑長度。如果這個數為 -11,則表示不存在從 ii 號點出發到 jj號點的路徑。

輸出格式

輸出一個整數,表示這個地區的交通便捷程度。

樣例輸入

4
0 1 -1 -1
-1 0 1 -1
-1 -1 0 1
1 -1 -1 0

樣例輸出

4
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn = 305;
const ll mod = 1e9 + 7;

int n;
int dis[maxn][maxn];



inline ll solve(int l,int r){
    ll res=0;
    if(l==r){
        for(register int i=1;i<=n;++i){
            for(register int j=1;j<=n;++j){
                if(i!=l&&j!=l){
                    res+=dis[i][j];
                }
            }
        }
        return res;
    }
    int pre[maxn][maxn];
    int mid=l+(r-l>>1);
    memcpy(pre,dis,sizeof(dis));
    for(register int k=mid+1;k<=r;++k){
        for(register int i=1;i<=n;++i){
            if(i==k)continue;
            for(register int j=1;j<=n;++j){
                if(i==j||k==j)continue;
                if(~dis[i][k]&&~dis[k][j]) {
                    if (~dis[i][j]) {
                        dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
                    } else {
                        dis[i][j] = dis[i][k] + dis[k][j];
                    }
                }
            }
        }
    }
    res+=solve(l,mid);
    memcpy(dis,pre,sizeof(pre));
    for(register int k=l;k<=mid;++k){
        for(register int i=1;i<=n;++i){
            if(k==i)continue;
            for(register int j=1;j<=n;++j){
                if(k==j||i==j)continue;
                if(~dis[i][k]&&~dis[k][j]) {
                    if (~dis[i][j]) {
                        dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
                    } else {
                        dis[i][j] = dis[i][k] + dis[k][j];
                    }
                }
            }
        }
    }
    res+=solve(mid+1,r);
    memcpy(dis,pre,sizeof(pre));
    return res;
}



int main() {
#ifndef ONLINE_JUDGE
    freopen("1.txt", "r", stdin);
#endif
    scanf("%d",&n);
    for(register int i=1;i<=n;++i){
        for(register int j=1;j<=n;++j){
            scanf("%d",&dis[i][j]);
        }
    }
    printf("%lld",solve(1,n));
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM