###Tnode
inline int f(......){ ......; return; }//本身設計的預估函數 priority_queue< node > q;//本身設計出存儲狀態和優先級的結構體 inline int bfs(){ q.push(初始state); while(q.size()){ node now=q.front(); q.pop(); if(now==ans) return ......; if(vis[now.(......)]) continue; for(......){ ......(得出新狀態); q.push(node(新狀態,新狀態的代價+預估值)); } } }
int stack[maxn],top; bool vis[maxn],instack[maxn]; void dfs(int u){ vis[u]=instack[u]=true,stack[++top]=u; for(register int i=head[u];~i;i=e[i].next){ int v=e[i].to; if(!vis[v]) dfs(v); else if(instack[v]){ int w,t=top; do{ w=stack[t--],instack[w]=false; ......(有關環的操做); }while(w!=v); } } instack[u]=false,top--; }
void dfs(int u){ dfn[u]=++tot; for(register int i=head[u];~i;i=e[i].next){ int v=e[i].to; if(v==fa[u]) continue; if(!dfn[v]) fa[v]=u,dfs(v); else if(dfn[u]<dfn[v]){ ......(環中關於v的操做) do{ ......(環中關於fa[v]的操做); v=fa[v]; }while(v!=u); } } }
int bit[];//原數 dfs(int len,state,bool havelim){//分別爲:當前在第幾位,前幾位的狀態,當前是否有限制 if(len==0) return (是否知足條件); if(!havelim&&dp[len][state]) return dp[len][state];//記憶化 int lim=havelim?bit[len]:9; long long cnt=0;//多少個知足條件的數 for(register int i=0;i<=lim;i++){ if(不知足條件) continue; cnt+=dfs(len-1,next state,havelim&&i==lim); } return havelim?cnt:dp[len][state]=cnt;//記憶化 }
void dfs(int u,int pre){ for(register int i=head[u];~i;i=e[i].next){ int v=e[i].to; if(v==pre) continue; ......(由u轉移到v); dfs(v,u); ......(由v轉移到u); } }
int low[maxn],dfn[maxn],tot; int stack[maxn],top; void tarjan(int u){ dfn[u]=low[u]=++tot,stack[++top]=u; for(register int i=head[u];~i;i=e[i].next){ int v=e[i].to; if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]); else low[u]=min(low[u],dfn[v]); } if(dfn[u]==low[u]){ int v; cnt++; do{ v=stack[top--],......(關於邊雙的操做); }while(v!=u); } } //若是題目不保證圖連通,那麼在main函數中寫這句話: for(register int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
int fa[maxn]; bool vis[maxn]; int get(int x){ return x==fa[x]?x:fa[x]=get(fa[x]); } void tarjan(int u,int pre){ vis[u]=true; for(register int i=g.head[u];~i;i=g.e[i].next){ v=g.e[i].to; if(v!=pre) tarjan(v,u),fa[v]=u; } for(register int i=q.head[u];~i;i=q.e[i].next){ int v=q.e[i].to; if(vis[v]) q[i].lca=q[i^1].lca=get(v); } } //main函數中 for(register int i=1;i<=n;i++) fa[i]=i; tarjan(1,1);
int low[maxn],dfn[maxn],tot; void tarjan(int u){ dfn[u]=low[u]=++tot; stack[++top]=u,in_stack[u]=true; for(register int i=head[u];~i;i=e[i].next){ int v=e[i].to; if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]); else if(in_stack[v]) low[u]=min(low[u],dfn[v]); } if(low[u]==dfn[u]){ int v; cnt++;//強連通份量個數+1 do{ v=stack[top--],in_stack[v]=false; ......(關於強連通份量的操做); }while(v!=u); } } //若是題目不保證圖連通,那麼在main函數中寫這句話: for(register int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
int low[maxn],dfn[maxn],tot; int stack[maxn],top; void tarjan(int u){ dfn[u]=low[u]=++tot,stack[++top]=u; for(register int i=head[u];~i;i=e[i].next){ int v=e[i].to; if(!dfn[v]){ tarjan(v),low[u]=min(low[u],low[v]); if(dfn[u]<=low[v]){//u爲割點 int w; cnt++; do{ w=stack[top--],......(關於點雙的操做); }while(w!=v); ......(把u也處理進點雙內); } } else low[u]=min(low[u],dfn[v]); } } //若是題目不保證圖連通,那麼在main函數中寫這句話: for(register int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);