2019暑期集训 - Day 6
呵呵,也没听清楚啥,总结下图论吧
图
1.存储
1.邻接矩阵
int t[n+1][n+1];
t[i][j] 表示点 i 至点 j 的距离
一般配合 Floyd 使用
使用时注意初始化和会不会 MLE
2.邻接表
struct edge
{
int to,w;//to是到的点,w是权值
};
vector<edge> t[n+1];
t[i].w 表示从点 i 到点 t[i].to 的距离
一般配合 SPFA 和 Dijkstra 使用
2.遍历
深搜(递归)
DFS ...
广搜(队列)
BFS ...
3.最短路
1.Floyd
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j&&j!=k&&i!=k)
t[i][j]=min(t[i][j],t[i][k]+t[k][j];
多对多
注意 \(O(n^3)\) 会不会 TLE
2.SPFA
类似广搜
用队列存储即将访问的点
可处理负权环(进队次数>n时有负权环)
一对多
注意负权环和初始化
有数据点会卡 SPFA ,如果没有权值为负就用 Dijkstra
3.Dijkstra
每次标记目前能走到的最近的点
用堆或者说优先队列( priority_queue )优化
权值必须为非负数
一对多
4.欧拉回路
深搜 + 毁图
5.最小生成树
sort + 并查集
慢
其他方法还没学

浙公网安备 33010602011771号