1.图的邻接表 模板
#include <stdio.h>
int main()
{
int u[10],v[10],w[10],first[10],next[10];
int n,m,i,j;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
first[i] = -1;
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&u[i],&v[i],&w[i]);
next[i] = first[u[i]]; // first[u[i]] 保存定点u[i] 的第一条边的编号
first[u[i]] = i; //next[i] 存储编号为i的边的下一条边的 编号
}
printf("\n\n\n");
int k;
for(i=1;i<=n;i++)
{
k = first[i];
while(k!=-1)
{
printf("%d %d %d\n",u[k],v[k],w[k]);
k = next[k];
}
}
return 0;
}
2 Dijkstra 算法
时间复杂度为O((M+N)log N),空间复杂度为O(m),
适合稠密图,不可以处理负权问题
其基本原理是:每次新扩展一个距离最短的点,更新与其相邻的点的距离。当所有边权都为正时,由于不会存在一个距离更短的没扩展过的点,所以这个点的距离永远不会再被改变,因而保证了算法的正确性。不过根据这个原理,用Dijkstra求最短路的图不能有负权边,因为扩展到负权边的时候会产生更短的距离,有可能就破坏了已经更新的点距离不会改变的性质。
算法步骤:
a.初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则<u,v>正常有权值,若u不是v的出边邻接点,则<u,v>权值为∞。
b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。
c.以k为新考虑的中间点,修改U中各