邻接表用来储存稀疏图很好(图为G<V,E>,若E<<V²,即边数小,则称为稀疏图),下面解释一下啊哈算法上关于邻接表的代码,有点绕。
首先需要2个数组,first[]和next[],first的作用是找某一点的第一条边(其实最后遍历邻接表是以读入的反方向来遍历的,比如1顶点的2条出边 1 4 9和1 2 5,输入顺序是1 4 9先,1 2 5 后,但遍历是先遍历1 2 5,再遍历1 4 9,所以这里用“某一点的第一条边”来解释也不太好,只能说能在first开始,找到所有边…),next的作用当然是往下找这个点所有的出边啦
//核心代码
for(int i=1;i<=m;i++)
{
cin>>u[i]>>v[i]>>w[i];
next[i]=first[u[i]];
first[u[i]]=i;
}
啊哈first数组是初始化为-1,个人感觉没必要,直接默认0就行了
所以图中-1均改为0
以上为读入的步骤,主要是理解这种方法的巧妙之处,如果理解不了也没事,就两句话,背过就行了(我就是背的)…
接下来是遍历(输出)过程
//核心代码
for(int i=1;i<=n;i++)
{
int k;
k=first[i];//first的作用是找某一点的第一条边
while(k!=0)
{
cout<<u[k]<<" "<<v[k]<<" "<<w[k]<<endl;
k=next[k];//next作用是接着找该点所有出边
}
}
完整代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
int u[99],v[99],w[99];
int first[99]={0},next[99]={0};
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>u[i]>>v[i]>>w[i];
next[i]=first[u[i]];
first[u[i]]=i;
}
for(int i=1;i<=n;i++)
{
int k;
k=first[i];
while(k!=0)
{
cout<<u[k]<<" "<<v[k]<<" "<<w[k]<<endl;
k=next[k];
}
}
return 0;
}
样例
4 5
1 4 9
4 3 8
1 2 5
2 4 6
1 3 7