本文整理汇总了C++中Portal::i方法的典型用法代码示例。如果您正苦于以下问题:C++ Portal::i方法的具体用法?C++ Portal::i怎么用?C++ Portal::i使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Portal
的用法示例。
在下文中一共展示了Portal::i方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: dist
long Portal::dist(Portal &p) const
{
//Om de är i samma grupp
if (p.group->id == this->group->id)
{
//Om du ska hitta avtåndet i en cykel
if (group->type == 1)
{
if (p.i() < i())
return group->high - i() + 1 + p.i() - group->low;
else
return p.i() - i();
}
//Avståndet i en gren
if (group->type == 2)
{
if (p.in(group) && p.i() > i())
return p.i() - i();
else
return -1;
}
}
else
{
//Om det finns en väg mellan de två nodernas grupper
if (group->merge.find(p.group->id) != group->merge.end())
{
//Om noden har en index högre än där grenen ansluter till dens grupp
if (portals[group->merge[p.group->id].first].i() <= p.i())
{
return group->high - i() + 1 + group->merge[p.group->id].second + p.i() - portals[group->merge[p.group->id].first].i();
}
else if (p.group->type == 1)
{
return group->high - i() + 1 + group->merge[p.group->id].second + p.group->high - portals[group->merge[p.group->id].first].i() + p.i() - p.group->low + 1;
}
}
else
return -1;
}
return -1;
}
示例2: rec
//Skapa den nya datastrukturen med grupper
//Varje nod besöks 1 gång O(N)
//a = noden som skall besökas, low = lägsta noden (ny index) som besökts (början på en gren)
inline Group * rec(long a, const long & low)
{
Portal * p = &portals[a];
//Om noden inte har fått en ny index
if (p->i() == 0) {
//Ge en ny index
p->new_index = first++;
Group * g = rec(p->exit, low);
//Om vi ansluter till en cykel
if (g->type == 1)
{
//Om den nuvarande noden finns i cykeln
if (p->in(g))
{
//sätt nodens grupp till cykelns
return p->group = g;
}
else
{
//Annars skapa en gren
p->group->type = 2;
p->group->merge[portals[p->exit].group->id] = make_pair(p->exit, 0);
p->group->low = low;
p->group->high = p->new_index;
return p->group;
}
}
else
{
//Om numret inte finns i den nuvarande grenen
if (!p->in(g)) {
//_(Optimering)_
//Om du ansluter en nod i början av grenen
if (portals[p->exit].i() == g->low)
{
//Flytta upp noderna i grenens index så att de nu är över den nuvarande nodens index
g->add += (p->i() - g->low) + 1;
g->high += (p->i() - g->low) + 1;
first = g->high + 1;
p->new_index -= g->add;
g->low = low;
}else
{
//Om den nya noden ansluter mitt på grenen skapa en ny gren.
p->group->type = 2;
//Hämta avtånde och anslutningsinformation från överliggadne gren
for (auto item : g->merge)
p->group->merge[item.first] = make_pair(item.second.first, item.second.second + g->high - portals[p->exit].i() + 1);
p->group->merge[g->id] = make_pair(p->exit, 0);
p->group->low = low;
p->group->high = p->new_index;
return p->group;
}
}
else
{
//Om noden finns på grenen justera dens index
p->new_index -= g->add;
}
return p->group = g;
}
}
else
{
//Om noden är besökt men inte har en grupp
if (p->group->type == 0)
{
//Skapa en cykel
p->group->type = 1;
p->group->low = p->i();
p->group->high = first - 1;
return p->group;
}
else
{
return p->group;
}
}
}