以前邻接表都用vector,今天学习了下一种手写的邻接表,学会后也挺方便的。
传上来和大家分享~~。
#include <stdio.h>
#include <string.h>
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define Max_n 100005
#define Max_e 10005
struct Vertex
{
int head; //head记录某点的的信息,即从E中的哪个下标开始
}V[Max_n];
struct Edge
{
int v,w; //v表示连接点的编号,w表示此边的权值
int next; //next负责连接和此点相关的边
}E[Max_e];
int top; //top记录已用E的个数,且保证每个E独立
void Init()
{
top = 0;
CLR(V,-1);
}
void Add_edge(int u,int v,int w) //演示如何添加边
{
E[top].v = v;
E[top].w = w;
E[top].next = V[u].head; //链表的头插法
V[u].head = top++; //链表的头指针改为此边编号
}
void dfs(int x) //演示如何遍历
{
for(int i = V[x].head; i != -1;i = E[i].next)//i为边在E中的编号
{
int v = E[i].v;
int w = E[i].w;
}
}
写成模板,用着更爽。
#include <stdio.h>
#include <string.h>
template<int N,int M>
struct Graph
{
int top;
struct Vertex{
int head;
}V[N];
struct Edge{
int v,next;
}E[M];
void init(){
memset(V,-1,sizeof(V));
top = 0;
}
void add_edge(int u,int v){
E[top].v = v;
E[top].next = V[u].head;
V[u].head = top++;
}
};
Graph<1000,10000> g;
int main()
{
return 0;
}