邻接表是一种链式的存储结构。对于图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*/