我正在尝试使用邻接表实现无向图。我使用了以下代码:
int v,e;
scanf("%d%d",&v,&e);
list<int> graph[3000];
for(int i=0;i<e;i++){
int a,b;
scanf("%d%d",&a,&b);
graph[a].push_back(b);
graph[b].push_back(a);
}
为了测试我的代码的运行时间,我创建了一个包含 3000 个顶点和所有可能边的输入文件。运行时间为 2.2 秒。我尝试通过将其更改为二维数组来进行优化,如下所示
int graph[3000][3000];
for(int i=0;i<e;i++){
int a,b;
scanf("%d%d",&a,&b);
graph[a][p[a]]=b;
graph[b][p[b]]=a;
p[a]++;
p[b]++;
}
其中“p”的大小为 3000,初始化为全零。对于相同的输入文件,此代码仅在 0.35 秒内运行。我正在使用 gcc-4.3.2 编译器。我知道在列表末尾插入可以在恒定时间内完成,那么为什么第一个代码运行缓慢?是否有机会优化链表实现?
提前致谢