稀疏图的的边没有那么多,为了节省空间我们使用邻接表去存储。这种法中每个节点i都有一条链表,里面保存着从i出发的所有边。对于无向图来说,每条边会在临接表出现两次。这里用数组实现临接表:首先给每条边编号,然后用first[u]保存结点u的第一条边的编号,next[e]表示编号为e的边的“下一条边”的编号。
const int maxn=; //最大结点数
int n,m; //n个结点、m条边
int hand[maxn]; //头结点
int u[maxn],v[maxn],w[maxn],next[maxn]; //起点集合、终点集合、权值集合、指针集合
struct Edge{
int u;
int v;
int cost;
int next;
};
Edge edges[maxn];
void read_graph(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i<n;i++)hand[i]=-1;
for(int e=0;e<m;e++){
scanf("%d%d%d",&edges[e].u,&edges[e].v,&edges[e].cost);
edges[e].next=hand[edges[e].u];
hand[edges[e].u]=e;
}
}