图邻接表的两种实现方式模板:
链表:
struct node { int v; //边的结束顶点 int w; //边的长度 node* next; //指向以同一起点的下一条边的指针 }*head[N],H[M]; //head[u]指向以u为起始点的第一条边 void init() { memset(head,NULL,sizeof(head)); } void add(int u, int v, int w)//添加边 { node* p = &H[tt++]//new node; p->v = v; p->w = w; p->next = head[u]; head[u] = p; } //使用的时候,找u的邻接点 for(node* p = head[u]; p != NULL; p = p->next) { int v = p->v; //在这里作相应的处理 indegree[v]--; }
边表:
struct node { int u,v,w; int next; }g[M];//作为静态内存来使用,速度快 int head[N],t=0; void init() { t = 0; memset(head,-1,sizeof(head)); } void add(int u, int v, int w)//添加边 { g[t].u = u; g[t].v = v; g[t].w = w; g[t].next = head[u]; head[u] = t; t++;//为下一次做准备 } //使用的时候,找u的邻接点 for(int = head[u]; i != -1; i = g[i].next) { int v = g[i].v; //在这里作相应的处理 indegree[v]--; }