模板 mú bǎn
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板 mú bǎn相关的知识,希望对你有一定的参考价值。
链式前向星
1 #include<string.h> 2 #define MAX 10000 3 struct node 4 { 5 int to,nex,wei; 6 }edge[MAX*2+5]; 7 int head[MAX+5],cnt; 8 void add(int u,int v,int w)//添加一个单向边u->v 权为w 9 { 10 edge[cnt].to=v; 11 edge[cnt].wei=w 12 edge[cnt].nex=head[u]; 13 head[u]=cnt++; 14 } 15 int main() 16 { 17 memset(head,-1,sizeof(head));//初始化为-1 18 cnt=0;//初始化 0 19 }
tarjan
1 #include<stack> 2 #include<algorithm> 3 #include<string.h> 4 using namespace std; 5 stack<int>s; 6 int dfn[1000],low[1000],scc[1000];//dfn[]时间戳 low[]最浅到达的点的时间戳 scc[]属于第几个scc 7 int index;//时间戳 8 int sccnum;//强连通的序号&&数量 9 void tarjan(int t) 10 { 11 dfn[t]=low[t]=++index;//记录时间戳 12 s.push(t);//入栈 13 for(int i=head[t];~i;i=edge[i].nex)//遍历儿子 14 { 15 int v=edge[i].to;//v是儿子 16 if(!dfn[v])//如果没走过 17 { 18 tarjan(v);//向下递归 19 low[t]=min(low[t],low[v]);//更新为min(当前,儿子) 20 } 21 else if(!scc[v])//如果不在栈中 22 { 23 low[t]=min(low[t],dfn[v]); 24 } 25 } 26 if(low[t]==dfn[t])//出栈 27 { 28 sccnum++; 29 while(!s.empty()) 30 { 31 int x=s.top(); 32 scc[x]=sccnum; 33 s.pop(); 34 if(x==t)//直到刚刚出去的和现在的一样 35 break; 36 } 37 } 38 } 39 int main() 40 { 41 index=0; 42 sccnum=0; 43 memset(dfn,0,sizeof(dfn)); 44 memset(low,0,sizeof(low)); 45 memset(scc,0,sizeof(scc)); 46 //初始化 47 }
LCA
1 int dep[MAX+5],vis[MAX+5],fa[MAX+5],f[MAX+5][20]; 2 int lca(int x,int y){ 3 if(dep[x]<dep[y]) 4 swap(x,y);//x为较深的 5 for(int i=16;i>=0;i--) 6 if(dep[f[x][i]]>=dep[y]) 7 x=f[x][i]; 8 if(x==y) 9 return x; 10 for(int i=16;i>=0;i--) 11 if(f[x][i]!=f[y][i]) 12 x=f[x][i],y=f[y][i]; 13 return f[x][0]; 14 } 15 void dfs(int t,int d) 16 { 17 dep[t]=d; 18 for(int i=head[t];~i;i=edge[i].nex) 19 { 20 int v=edge[i].to; 21 if(vis[v])continue; 22 vis[v]=1; 23 fa[v]=t; 24 dfs(v,d+1); 25 } 26 } 27 int main() 28 { 29 memset(vis,0,sizeof(vis)); 30 memset(f,0,sizeof(f)); 31 memset(fa,0,sizeof(fa)); 32 }
以上是关于模板 mú bǎn的主要内容,如果未能解决你的问题,请参考以下文章