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 + 并查集

其他方法还没学

posted @ 2019-12-27 16:36  imzzy  阅读(45)  评论(0)    收藏  举报