bnu 12870(离散图的floyd)

将塔的高度离散化。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<cmath>
#include<vector>
using namespace std;

const int N=630;
const int inf=599999999;
int n,f,m,q;
int dis[N][N];
map<pair<int,int>,int>myh;
vector<int>edge[N];
int h[N];
int cnt;
int ABS(int x){
    return x>=0?x:-x;
}

void init()
{
    for(int i=1; i<=n; i++)
    {
        for(int j=0; j<edge[i].size(); j++)
        {
            for(int k=j+1; k<edge[i].size(); k++)
            {
                dis[edge[i][j]][edge[i][k]]=dis[edge[i][k]][edge[i][j]]=ABS(h[edge[i][j]]-h[edge[i][k]]);
            }
        }
    }
}

void floyd()
{
    for(int k=1; k<=cnt; k++)
        for(int i=1; i<=cnt; i++)
            for(int j=1; j<=cnt; j++)
                dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);
}

int main()
{
    int cas;
    cin>>cas;
    int u,f1,v,f2,w;
    int x,y;
    pair<int,int>tmp;
    while(cas--)
    {
        cin>>n>>f>>m;
        for(int i=1; i<=600; i++)
            for(int j=1; j<=600; j++)
            {
                if(i==j)   dis[i][j]=0;
                else       dis[i][j]=inf;
            }

        cnt=n;
        for(int i=1; i<=n; i++)
        {
            edge[i].clear();
            edge[i].push_back(i);
            h[i]=1;
            if(i<n)
            dis[i][i+1]=dis[i+1][i]=1;
        }
        dis[n][1]=dis[1][n]=1,h[n]=1;
        myh.clear();
        for(int i=1; i<=m; i++)
        {
            cin>>u>>f1>>v>>f2>>w;
            tmp=make_pair(u,f1);
            if(f1!=1)
            {
                if(myh[tmp]==0)
                {
                    cnt++;
                    myh[tmp]=cnt;
                    h[cnt]=f1;
                    edge[u].push_back(cnt);
                }
                x=myh[tmp];
            }
            else x=u;
            tmp=make_pair(v,f2);
            if(f2!=1)
            {
                if(myh[tmp]==0)
                {
                    cnt++;
                    h[cnt]=f2;
                    myh[tmp]=cnt;
                    edge[v].push_back(cnt);
                }
                y=myh[tmp];
            }
            else y=v;

            dis[x][y]=min(dis[x][y],w);
            dis[y][x]=dis[x][y];
        }
        init();
        floyd();
        cin>>q;
        while(q--)
        {
            cin>>u>>f1>>v>>f2;
            int ans=inf;
            if(u==v)ans=ABS(f1-f2);
            for(int i=0; i<edge[u].size(); i++)
            {
                x=edge[u][i];
                for(int j=0; j<edge[v].size(); j++)
                {
                    y=edge[v][j];
                    ans=min(ans,dis[x][y]+ABS(h[x]-f1)+ABS(f2-h[y]));
                }
            }
            cout<<ans<<endl;
        }
    }
    return 0;
}


 

你可能感兴趣的:(bnu 12870(离散图的floyd))