邻接表是一种链式的存储结构。对于图G中的每个顶点Vi吧所有邻接于Vi顶点Vj链成一个单链表,这个单链表称为顶点Vi的邻接表。
邻接表中每个表节点有三个属性:其一,邻接点序号to,用以存放与顶点Vi 相邻接的顶点vj的序号j,其二,边上的权值我,其三,为指针next,用来将邻接表的所有节点链在一起。另外,为每个顶点Vi的邻接表设置一个具有两个属性的表头节点:一个是顶点序号from,另一个是指向其邻接表的指针first,它是指向Vi的邻接表的第一个节点的指针。建立一个Vnode的数组就可以访问每个顶点的邻接表了。
#include <string.h> #include <stdio.h> #include <iostream> using namespace std; const int maxn=100005; struct edgenode { int to; int w; edgenode *next; }; struct vnode { int from; edgenode *first; }; vnode adjilist[maxn]; int main() { int n,m,j,i,w; while(cin >> n>> m) { for(int ii=1;ii<=m;ii++) { cin>> i>> j>>w; edgenode *p=new edgenode(); p->to=j; p->w=w; p->next=adjilist[i].first; adjilist[i].first = p; } for(int i=1;i<=n;i++) { for(edgenode *k=adjilist[i].first;k!=NULL;k=k->next) { cout << i << " "<< k->to<<' ' << k->w<< endl; } } } return 0; }
另外,还可以只用到一个结构体,接着结构体数组定义为结构体指针数组,代码如下:
#include <stdio.h> #include <string.h> #include <iostream> using namespace std; struct edgenode { int to; int w; edgenode *next; }*N[10005]; int main() { int i,j,w,n; while(~scanf("%d",&n)) { for(int kk=0; kk<n; kk++) { cin >>i>> j>>w; edgenode *p=new edgenode(); p->to=j; p->w=w; p->next=N[i]; N[i]=p; } for(int i=1; i<=n; i++) { for(edgenode *k=N[i]; k!=NULL; k=k->next) { cout <<i <<" "<<k ->to<<" "<< k->w<<endl; } } } return 0; }
/*12 5 8 9 6 1 12 8 3 11 1 2 4 3 1 22 4 3 17 7 4 25 6 5 9 8 7 7 1 6 9 3 2 19 6 7 4*/