BFS 方法中的 TLE for SPOJ AKBAR
TLE in BFS approach for SPOJ AKBAR
我的方法是从士兵源做一个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++)
相关文章:
- "error: no matching function for call to"构造函数错误
- 表示"accepting anything for this template argument" C++概念的通配符
- 如何在C++中从两个单独的for循环中添加两个数组
- 在Linux for Windows上编译C++代码时出错
- 调用专用模板时出错"no matching function for call to [...]"
- 为什么我的for循环不能正确获取argv
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 在基于范围的for循环中使用结构化绑定声明
- 通过for循环使用用户输入填充列表
- 使用for循环检查数组中的重复项
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 正在使用for循环创建QScatterSerie
- Python中的for循环与C++有何不同
- std::memory_order for std::atomic:<T>:wait
- 在更改for循环的第三部分后,未使用for循环结果
- 在 for 循环中查找问题时遇到困难
- BFS 方法中的 TLE for SPOJ AKBAR
- Getting WA for SPOJ smpseq