WA求助
查看原帖
WA求助
391452
_sun_楼主2023/10/31 12:47
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <set>
using namespace std;
int f[160][160];
bool g[160][160];
int d[2010][2010];
int n,m;
struct node
{
    int step;
    int x,y;
    bool operator< (const node s) const
    {
        return step<s.step;
    }
} a[2010];
int dx[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
int dy[8] = {1, 2, 2, 1, -1, -2, -2, -1};
void dfs()
{
    for (int i = 1; i <= n; i ++ )
    {
        queue<node> q;
        q.push({0,a[i].x,a[i].y});
        g[a[i].x][a[i].y]=true;
        while (!q.empty())
        {
            int xx=q.front().x,yy=q.front().y;
            int uu=q.front().step;
            if(f[xx][yy])
                d[i][f[xx][yy]]=uu;
            q.pop();
            for (int j = 0; j < 8; j ++ )
            {
                int xx1=dx[j]+xx,yy1=dy[j]+yy;
                if(xx1<=0||yy1<=0||xx1>m||yy1>m)
                    continue;
                if(!g[xx1][yy1])
                {
                    g[xx1][yy1]=true;
                    q.push({uu+1,xx1,yy1});
                }
            }
        }
        for (int i = 1; i <= m; i ++ )
            for (int j = 1; j <= m; j ++ )
                g[i][j]=false;
    }
    return ;
}
bool h[2010];
int sovle()
{
    int res=1;
    int k=n-1;
    int ans=0;
    set<node> q;
    set<node>::iterator id;
    while (k -- )
    {
        h[res]=true;
        for (int i = 1; i <= n; i ++ )
            if(!h[i])
                q.insert({d[res][i],res,i});
        id=q.begin();
        node l=*id;
        while (h[l.y])
        {
            q.erase(l);
            id=q.begin();
            l=*id;
        }
        q.erase(l);
        res=l.y;
        ans+=l.step;
    }
    return ans;
}
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i ++ )
    {
        cin >> a[i].x >> a[i].y;
        f[a[i].x][a[i].y]=i;
    }
    dfs();
    cout << sovle()+n-1;
}
2023/10/31 12:47
加载中...