#include using namespace std; //用链表来代替vector实现邻接表 (用数组来模拟存储链表) 拉链法的HASH表 const int N = 1010; //结点个数 int h[N]; //h[N]表示有N条单链表的头 int e[N << 1]; //e[N<<1]代表每个节点的值 链表记录的是关系 int ne[N << 1]; //ne[N<<1]代表每个节点的下一个节点号 链表记录的是关系 int idx; //结点编号 int w[N << 1]; //边的权值 //一般认为N<<1就够用了,就是2*N个大小 // 添加一条边a->b (头插法),边权值是val void add(int a, int b, int val) {//有的时候可以不用建立权值 e[idx] = b, ne[idx] = h[a], w[idx] = val, h[a] = idx++; // https://www.acwing.com/video/21/ yxc老师的讲解头插法 // ne[idx]=h[a]的意义:将原来h[a]是指向第一个子结点的,现在,记录idx的下一个结点是原来的第一个节点,它现在是第一个了, // 原来的第一个是第二个了。 // h[a]=idx++的意义: a这个结点的第一个子结点是idx了,然后再把 idx增加1个!方便下次加入新结点 } int main() { //给定初始值 memset(h, -1, sizeof h); /* 遍历以u为出发点的链表办法 for(int i=1;i<=n;i++){ //n个点 for (int j = h[u]; j != -1; j = ne[j]) {//遍历以i为起点的所有边 } } 其实链式前向星也是枚举每个起点的所有边,只不过它是以边进行建图的 */ return 0; }