emming,高中部集训在春节前要上5天,春节后上2天(如果我没记错的话QAQ)。
学校的电脑系统重装了一遍,把万恶的冰点还原(^-^)和教师监控系统(但是我怎么接老师课件啊QAQ)刷掉了,嘿嘿嘿。
以上是废话。
今天课程表:
概率空间:
期望:
期望的线性性:
算法:
拓展:
邻接表:$O(n+m)$
邻接矩阵:$O(n^2)$
$Code$:
#include <iostream>
#include <cstdio>
using namespace std;
struct node{
int v,next;//使用邻接表存边
}edge[25005];
int n,m,head[10005],cnt,deg[10005];
bool book[10005];
inline void add(int u,int v){
cnt++;
edge[cnt].v=v;
edge[cnt].next=head[u];
head[u]=cnt;
return;
}
int main(){
int a,b;
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++){
scanf("%d%d",&a,&b);
add(a,b);
deg[b]++;
}
for (int i=1;i<=n;i++){
int start=-1;
for (int j=1;j<=n;j++)
if (!book[j]&°[j]==0){
start=j;
book[j]=true;
break;
}
if (start==-1){
cout <<"T_T"<<endl<<n-i+1<<endl;
return 0;
}
for (int j=head[start];j!=0;j=edge[j].next)
deg[edge[j].v]--;
}
cout <<"o(∩_∩)o"<<endl;
return 0;
}
单源最短路$(Single-Source Shortest Paths)$,对于给定带权图(有向或无向),计算从源点$s$到其它所有顶点的最短路径。
松弛:若在处理过程中,有两点$u, v$不满足“三角形性质”,则可作改进:
if (dis[u] + len[u][v] < dis[v])
dis[v] = dis[u] + len[u][v];
$Dijkstra$算法:
算法:将图$G$中顶点分为两个集合$A$, $B$,$A$由已求出最短路的顶点组成,$B$由其他顶点组成,初始时$A$为空,记源点$s$到每个点最短路径为$dis[v]$,初始时$dis[s] = 0$,其余点$dis[v] = INF$。
void dijkstra(int s){
置dis初值;
循环n次{
找到B集合中dis最小的点v;
将v从B中剔除、加入A;
用v对其相邻点试作松弛;
}
}
* 时间复杂度
1. $O(n^2)$:使用循环确定松弛顶点。
2. $O((n+m)\log m)$:使用**优先队列**。
* 对象:
1. 有向图、无向图(无向图看做两点两条有向边)
2. 有环或无环
3. **不可有负权边**
$Bellman-Ford$算法
扩展:
$SPFA$算法$(Shortest Path Faster Algorithm)$,$Bellman-Ford$算法的一种队列改进:
优化:
多源最短路$(Multiple-Source Shortest Paths)$:对于给定带权图(有向或无向),计算所有顶点间两两最短路径。
$Floyd$算法
算法:有一些$dp$的思想->_<-,$f_k[i][j]$表示从$i$到$j$只经过前$k$个点的最短路径。初始状态:$f_0[i][i]=0$,$f_0[i][j]=(u,v)\in E?dis(u,v):INF$。
$Floyd$算法核心代码:
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
* 时间复杂度:$O(n^3)$
今天的考试有点难,或者说码量比较大,说明我还是太菜了QAQ
本文作者:Snowflake_Pink
本文链接:https://snowflake.pink/archives/7/
最后修改时间:2020-04-13 11:18:33
本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!