本文介绍存储图的方式以及stl一些用法
1.用邻接表存储图
struct Edge{
int to;
int next;
Edge(){
next=0;
}
}; //构建一条边
void addEdge(int from,int to){
num++;
e[num].next=head[from];
e[num].to=to;
head[from]=num;
}//添加边的方式,from为起点,to为终点
for(int i=head[v];i!=0;i=e[i].next){
}//遍历以v为起点的各个邻接点
解析:head数组用于存储各点作为起点,所连接的边。例如head【1】是编号为1的点中一条边所指向的点的num。
2.stl实现优先队列`
struct Node2
{
int val;
int id;
}arr2[100];
bool operator <(const Node2 &a,const Node2 &b)
{
return a.val<b.val;//大根堆
}
priority_queue<Node2>q2;
q2.push(arr2[i]);//插入元素
while(!q2.empty())
{
cout<<q2.top().val;
q2.pop();
}//遍历元素
3.stl实现平衡树(寻找某节点的前驱和后继,效果同双向链表)
struct Node
{
int id,al;
friend bool operator <(Node a,Node b)
{
return a.al<b.al;
}
}arr[100];
multiset<Node> q;//也可改为set去除重复元素
q.insert(arr[i]);//元素的插入
multiset<Node>::iterator it;//构建迭代器
Node now;
now.al=9;
for (it=q.begin();it!=q.end();it++)
{
cout<<(*it).al<<" ";//元素的遍历
}
it=q.lower_bound(now);//元素的查找
cout<<(*it).al<<" ";
it=q.upper_bound(now);
cout<<(*it).al<<" ";