不写点东西明天要挂啊
不想看傻逼的直接跳到后面
0.存储结构(你妈写这个凑字数呀
邻接表&插入边
struct edge{ int to,next,v; }e[M]; int cnt,last[N]; void insert(int a,int b,int c){ e[++cnt]=(edge){b,last[a],c};last[a]=cnt; } void link(int a,int b,int c){ insert(a,b,c);insert(b,a,c); }
1.闭着眼睛摸了个spfa哈哈哈哈哈哈哈哈
bool inq[N];int dis[N]; void spfa(int s,int t){ queue<int>q; inq[s]=true; FOR0(i,N)dis[i]=inf; dis[s]=0;q.push(s); while(!q.empty()){ int c=q.front();q.pop(); for(int i=last[c];i;i=e[i].next){ int v=e[i].to; if(dis[v]>dis[c]+e[i].v){ dis[v]=dis[c]+e[i].v; if(!inq[v]){ q.push(v); inq[v]=true; } } } inq[c]=false; } }
2.Tarjan · 逢写必错· 缩环算法
int scc,ind; int bel[N],ins[N],low[N],dfn[N]; stack<int>s; void tarjan(int v){ low[v]=dfn[v]=++ind; s.push(v);ins[v]=true; for(int i=last[v];i;i=e[i].next){ if(!dfn[e[i].to]) tarjan(e[i].to),low[v]=min(low[v],low[e[i].to]); else if(ins[e[i].to]) low[v]=min(low[v],dfn[e[i].to]); } int now=-1; if(dfn[x]==low[x]){ ++scc; while(now!=x&&!s.empty()){ int t=s.top();s.pop(); ins[t]=false; bel[t]=scc; } } }
如果有人发现这个也是错的明天加餐
这里是弹射标记
首先讨论一点和树有关的玩意
3.
LCA:基于倍增的:。。。
基于rmq的 :两点的LCA是两点dfs序间深度最浅的节点。。那么我们只要用最值查询的算法就好了
【感觉自己智商降低了
4.矩阵树定理
无向图生成树计数
预备知识:高斯消元,行列式
我们构建一个度数矩阵D D(i,j)在i!=j时等于i的度数,否则等于0
构造一个邻接矩阵A
然后这个图的基尔霍夫(这个名字?)矩阵是G,G(i,j)=D(i,j)-A(i,j)
然后我们计算这个行列式的值,就是这个图的生成树个数了
明天啥时候再写呢。。
时间: 2024-10-23 15:49:23