BFS 方法中的 TLE for SPOJ AKBAR

TLE in BFS approach for SPOJ AKBAR

本文关键字:for SPOJ AKBAR TLE 方法 BFS      更新时间:2023-10-16

我的方法是从士兵源做一个BFS,直到它的力量。但是,我正在感染 TLE。我在某篇帖子中发现原因可能是内存集,但我无法弄清楚 这是 ideone 链接 http://ideone.com/ljgRhi 或下面的完整代码

#include <bits/stdc++.h>
#define fio ios_base::sync_with_stdio(0);cin.tie(0) 
#define FOR(i, a, b) for(int i = a;i < b; i++)      
#define rev(i, a, b) for(int i = a;i > b; i--)      
#define si(a)   scanf("%d", &a)                     
#define pi(a)   printf("%dn", a)                   
typedef long long ll;                               //W
#define pb push_back                                //E
#define ff first                                        //A
#define ss second                                   //K
#define MOD (ll)1000000007
#define M_PI 3.14159265358979323846
#define N 1000005
#define EPS 1e-12
template <typename T> T gcd(T a, T b){return (b==0)?a:gcd(b,a%b);}
using namespace std;
vector<ll> g[N];
bool f[N]={0};
bool curr[N]={0};
//bool sold[N]={0};

bool solve(ll a, ll b)
{
    memset(curr, 0, sizeof(curr));
    if(f[a])
        return 0;
    queue<pair<ll, ll> > q;
    q.push({a, b});
    f[a]=1;
    curr[a] = 1;
    ll v, h;
    while(!q.empty())
    {
        v = q.front().ff;
        h = q.front().ss;
        q.pop();
        if(h>0)
        {
            for(auto w:g[v])
            {
                if(!curr[w])
                {
                    if(f[w])
                        return 0;
                    curr[w]=1;
                    f[w]=1;
                    q.push({w, h-1});
                }
            }
        }   
    }
    return 1;
}
int main()
{
    fio;
    ll t, n, r, m;
    cin>>t;
    while(t--)
    {
        pair<ll, ll> p; 
        cin>>n>>r>>m;
        while(r--)
        {
            ll x,y;
            cin>>x>>y;
            g[y].pb(x);
            g[x].pb(y);
        }
        vector<pair<ll, ll> > as;
        while(m--)
        {
            ll x,y;
            cin>>x>>y;
            //sold[x] = 1;
            p = {x, y};
            as.pb(p);
        }
        bool fl;
        for(auto i:as)
        {
            fl = solve(i.ff, i.ss);
            if(!fl)
                {cout<<"Non"; break;}
        }
        if(fl)      
        {
            for(ll i=1;i<=n;i++)
            if(!f[i])
            {
                fl=0;
                cout<<"Non"; 
                break;
            }
        }
        if(fl) cout<<"Yesn";
        //clear
        for(ll i=0;i<=n;i++)
            g[i].clear();
        //as.clear();
        memset(f, 0, sizeof(f));
        //memset(sold, 0, sizeof(sold));
    }
    return 0;
}

你可以避免不必要的复制,每个节点都会被完全探索,当且只有当它可以通过一些士兵的力量到达时,所以当另一个士兵到达一个已经探索的区域时,这意味着有两个守卫保护该区域,这不是最佳的。

这是接受的代码的链接(C++)