首页 > 代码库 > 模板 mú bǎn

模板 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