Фиолетовое дерево до книги, чтобы узнать больше хаоса, стремясь сделать только проблемы. Теперь мы узнаем о новом дереве этой структуры данных.
poj1330
Практиковать с родительским массивом для хранения дерева, и перемещаться по дереву.
До тех пор, как эта проблема так, чтобы идти к корню, через отметку позиции на линии, а затем определить, является ли другой через эту точку.
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=10000+10;
int a[maxn];
int t,n;
bool vis[maxn];
int main()
{
//freopen("in.txt","r",stdin);
cin>>t;
while(t--)
{
int x,y;
cin>>n;
memset(a,0,sizeof(a));
memset(vis,false,sizeof(vis));
for(int i=0;i<n-1;++i)
{
cin>>x>>y;
a[y]=x;
}
cin>>x>>y;
while(y!=0)
{
vis[y]=true;
y=a[y];
}
while(!vis[x])
{x=a[x];}
cout<<x<<endl;
}
return 0;
}
poj2499
Идея: Так как бинарное дерево для всех узлов в пути является уникальным, так что мы можем начать с узла, чтобы идти к корню.
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int t,kase=0;
int main()
{
cin>>t;
while(t--)
{
int a,b,right=0,left=0;
cin>>a>>b;
int temp;
while(a!=1||b!=1)//这里是或
{
if(a>b)
{
temp=(a-1)/b;//数据规模较大,一次减除来,因为根节点是(1,1)所以a-1,下面同理。
a-=(b*temp);
left+=temp;
}else
{
temp=(b-1)/a;
b-=a*temp;
right+=temp;
}
}
printf("Scenario #%d:\n%d %d\n\n",++kase,left,right);
}
return 0;
}
poj2255
Binary обход дерева
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
char a[30],b[30];
int L1,R1,L2,R2;
vector<char>ans;
void tree(int L1,int R1,int L2,int R2)
{
if(L1>R1)return ;
int k=0;
while(a[L1]!=b[L2+k])k++;
tree(L1+1,L1+k,L2,L2+k-1);
tree(L1+k+1,R1,L2+k+1,R2);
ans.push_back(a[L1]);
}
int main()
{
//freopen("in.txt","r",stdin);
while(cin>>a>>b)
{
ans.clear();
L1=strlen(a);
tree(0,L1-1,0,L1-1);
for(int i=0;i<ans.size();++i)
cout<<ans[i];
cout<<endl;
}
return 0;
}
poj2309
Идея: для наблюдения характеристик рисунка дерева.
1, если х нечетно, один узел.
2, если х четно, то в нижней части фигуры [х-2 ^ к + 1, х-1] [х + 1, х + 2 ^ к-1]. В чем 2 ^ к может быть х & - расчетная (х), связанная с отрицательным двоичным представлением.
#include <iostream>
#include <cstdio>
using namespace std;
int t,x,k;
int main()
{
cin>>t;
while(t--)
{
cin>>x;
k=x&(-x);
cout<<x-k+1<<" "<<x+k-1<<endl;
}
return 0;
}
zoj2724
Двоичные кучи, корневой узел меньше (больше) листовой узел, с использованием очереди приоритетов. Обратите внимание, что структура и использование STRCMP
Большое количество данных, предлагаемое изменение зсапЕ и Printf.
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <iostream>
using namespace std;
struct message
{
char name[100];
int data;
int priority;
bool operator <(const message &a) const
{
return a.priority<priority;
}
};
priority_queue<message>q;
char cmd[100];
message m;
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%s",&cmd)!=EOF)
{
if(strcmp(cmd,"GET")==0)
{
if(!q.size())cout<<"EMPTY QUEUE!\n";
else
{
cout<<q.top().name<<" "<<q.top().data<<endl;
q.pop();
}
}
else if(strcmp(cmd,"PUT")==0)
{
cin>>m.name>>m.data>>m.priority;
q.push(m);
}
}
return 0;
}
poj3253
* Хаффман дерево вес и путь самой низкого приоритета очереди здесь используются.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
priority_queue<int,vector<int>,greater<int> >q;
int main()
{
int n,temp;
while(cin>>n)
{
while(!q.empty())q.pop();
for(int i=0;i<n;++i)
{
cin>>temp;
q.push(temp);
}
int a,b;
long long ans=0;
while(q.size()>1)
{
a=q.top();q.pop();
b=q.top();q.pop();
ans+=(a+b);
q.push(a+b);
}
cout<<ans<<endl;
}
return 0;
}