使用邻接矩阵和邻接表存图的实现
其实已经在前面题解有提及,这里专门开一期。
邻接矩阵
适用于 Floyd 算法(Floyd 复杂度 O(n^3) )
const int inf = 0x3f3f3f3f; // 初始化 for (int i=1;i<numOfDots;i++) for (int j=1;j<=numOfDots;j++) if (i==j) map[i][j] = 0; else map[i][j] = inf; // 读入路径 for (int i=1;i<=numOfLines;i++) { cin >> m >> n >> k; map[m][n] = k; // map[n][m] = k; // 若双向边需同时赋值 }
邻接表
int numOfDots,numOfLines; // u,v,w 数组大小要根据实际大小设置,往往比 numOfLines 大 1. int u[numOfLines+1],v[numOfLines+1],w[numOfLines+1]; // head,next 数组大小根据实际情况设置,往往比 numOfDots 大 1. int head[numOfDots],next[numOfDots]; scanf("%d %d",&numOfDots,&numOfLines); // 输入 // 初始化 head 数组下标 1-numOfDots 的值为 -1(不存在) for (int i=1;i<=numOfDots;i++) head[i] = -1; for (int i=1;i<=numOfLines;i++) { scanf("%d %d %d",&u[i],&v[i],&w[i]); next[i] = head[u[i]]; head[u[i]] = i; // Head数组存储的是以该点为起点(按照加入时间顺序)最后加入的一条边。 // Next数组是以该边起始点为起点的上一条边(按照加入时间顺序) }
SoulWINTER OIBlogs