计蒜客 百度地图的实时路况

来源:互联网 发布:win10网络图标 编辑:程序博客网 时间:2024/05/16 23:36

编号从 1nn(300)个点。定义 d(u,v,w) 为从 u 号点出发,严格不经过 v 号点,最终到达 w 号点的最短路径长度,如果不存在这样的路径,d(u,v,w) 的值为 1。令P=1x,y,zn,xy,yzd(x,y,z)。求P
分治+floyd

#include<set>#include<cmath>#include<queue>#include<stack>#include<cstdio>#include<bitset>#include<cassert>#include<cstring>#include<complex>#include<iostream>#include<algorithm>#define pi acos(-1)#define inf (1<<30)#define INF (1<<62)#define y1 bflaisfnmasf#define y2 fsafgmalg#define tm afnsjkf#define j1 sfakf#define j2 fasndfkas#define CLR(x,f) memset(x,f,sizeof(x))#define CPY(x,y) memcpy(x,y,sizeof(x))#define prt(x) cout<<#x<<":"<<x<<" "#define prtn(x) cout<<#x<<":"<<x<<endl#define huh(x) printf("--------case(%d)--------\n",x)#define travel(x) for(Edge *e=h[x];e;e=e->n)#define TL#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;typedef long long ll;int n;const int M=305;void Min(int &x,int y){    if(x==-1||x>y)x=y;}struct mat{    int v[M][M];//long long?    void calc(int k){        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++)                if(v[i][k]!=-1&&v[k][j]!=-1)Min(v[i][j],v[i][k]+v[k][j]);    }}mat[10];int allc;long long ans=0;void div(int cas,int l,int r){    if(l==r){        for(int i=1;i<=n;i++){            if(i==l)continue;            for(int j=1;j<=n;j++){                if(j==l)continue;                ans+=mat[cas].v[i][j];              }        }        return;    }    int mid=l+r>>1;    allc++;    mat[allc]=mat[cas];    for(int i=l;i<=mid;i++)        mat[allc].calc(i);    div(allc,mid+1,r);    mat[allc]=mat[cas];    for(int i=mid+1;i<=r;i++)        mat[allc].calc(i);    div(allc,l,mid);    allc--;}int main(){    scanf("%d",&n);    allc=0;    for(int i=1;i<=n;i++)        for(int j=1;j<=n;j++)            scanf("%d",&mat[allc].v[i][j]);    div(allc,1,n);    allc--;    cout<<ans<<endl;    return 0;}
0 0
原创粉丝点击