邻接表模板
1.数组模拟链表实现
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
struct edge{ int u,v,w,next; }a[MAX]; int E,u,v,w; E = 0; memset(head,-1,sizeof(head)); void add(int u,int v,int w){ a[E].u = u;a[E].v = v;a[E].w = w; a[E].next = head[u];head[u] =E++; //head记录以u为结点的边的编号,a[E].next是模拟指针 //a是边,其中记录的是边上的结点,权值的值 } for(i = head[u];i!= -1;i = a[i].next){ //来取值进行操作 ....... }
~u 相当于u!=-1
2.vector实现(vector是向量,是一个可变长的动态数组,记录的是该节点相邻的所有的结点)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; vector<int>G[MAX]; void read_tree() { int u,v; scanf("%d",&n); for(int i = 0 ; i < n; i++){ scanf("%d%d",&u,&v); G[u].push_back(v); G[v].push_back(u); } }//记录的是一个结点相邻的点 for(int i = 0 ; i < G[u].size(); i ++){ int v= G[u][u]; .... }