邻接表的几种表示法
2014-07-15 11:00 gongti 阅读(352) 评论(0) 编辑 收藏 举报-
/* *第一种形式,这里也可以不使用struct结构体 */ int head[maxn],next[maxm] struct Edeg{ int from,to,dist; }edegs[maxm]; int edgenum; void addedge(int u,int v,int d) { p[edgenum]={u,v,dist}; next[edgenum]=first[u]; first[u]=edgenum++; } 对于节点x的遍历: for(int i=head[x];i!=-1;i=next[i]) { //i是边序号 } /* *第二种形式 */ int head[maxn]; struct Edge{ int from,to,dist; int next; }edges[maxm]; int edgenum; void addedge(int u,int v,int d) { edges[edgenum]={u,v,d,first[u]}; head[edgenum]=edgenum++; } 对于节点x的遍历: for(int i=head[x];i!=-1;i=edges[i].next) { //i是边序号 } /* *第三中形式 */ struct Edge{ int from,to,dist; }; vector<Edge> edges; vector<int> G[maxn]; void addedge(int u,int v,int d) { edges.push_back(Edge{u,v,d}); m=edges.size(); G[u].push_back(m-1); } 对于节点x的遍历: for(int i=0;i<G[x].size;i++) { //G[x][i]是边序号 Edge& e=edegs[G[x][i]]; ..... }