整理一下,背过吧,为了AC。
邻接矩阵:
DFS:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
void dfs(int p) { cout<<p<<" "; vis[p]=true; for(int i=1; i<=m; i++) if(!vis[i]) dfs(i); }
BFS:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
void bfs(int p) { queue<int> q; q.push(p); vis[p]=true; while(!q.empty()) { int t=q.front(); q.pop(); cout<<t<<" "; for(int i=1; i<=n; i++) { if(map[i][t]&&!vis[i]) { q.push(i); vis[i]=true; } } } }
Floyd:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
void floyd() { for(int k=1; k<=m; k++) for(int i=1; i<=m; i++) for(int j=1; j<=m; j++) if(map[i][j]>map[i][k]+map[k][j]) map[i][j]=map[i][k]+map[k][j]; }
Dijkstra:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
void dijsktra(int p) { for(int i=1;i<=n;i++) dis[i]=map[p][i]; vis[p]=true; dis[p]=0; for(int i=1;i<=n-1;i++) { min1=MAXN1; k=0; for(int j=1;j<=n;j++) { if(!vis[j]&&dis[j]<min1) { min1=dis[j]; k=j; } vis[k]=true; } for(int i=1;i<=n;i++) { if(!vis[i]&&map[k][i]<MAXN1&&dis[i]>dis[k]+map[k][i]) dis[i]=dis[k]+map[k][i]; } } cout<<dis[e]<<endl; }
SPFA:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
void spfa(int p) { queue<int> q; q.push(p); vis[p]=true; while(!q.empty()) { int t=q.front(); q.pop(); vis[t]=false; for(int i=1;i<=n;i++) { if(dis[i]>dis[t]+map[t][i]) { dis[i]=dis[t]+map[t][i]; if(!vis[i]) q.push(i); } } } cout<<dis[ep]; }
邻接表:
建表:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
void add_edge(int from,int to,int w) { edge[++num_edge].pre=head[from]; edge[num_edge].to=to; edge[num_edge].w=w; head[from]=num_edge; }
DFS:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
void dfs(int now,int fa) { for(int i=head[now]; i!=-1; i=edge[i].next) { if(v[edge[i].v]==0) { cout<<"->"<<edge[i].v; dfs(edge[i].v,now); v[edge[i].v]=1; } } }
SPFA:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
void SPFA(int u) { q.push(u); if_q[u]=true; while(!q.empty()) { u=q.front(); for(int i=head[u]; i!=0; i=edge[i].pre) { int v=edge[i].to; if(dis[u]+edge[i].w<dis[v]) { dis[v]=dis[u]+edge[i].w; if_q[v]=true; q.push(v); } } if_q[u]=false; q.pop(); } }
TARJAN:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
void tarjan(int x) { DFN[x]=LOW[x]=++tot; stack[++index]=x; visit[x]=1; for(int i=heads[x]; i!=-1; i=edge[i].next) { if(!DFN[edge[i].v]) { tarjan(edge[i].v); LOW[x]=min(LOW[x],LOW[edge[i].v]); } else if(visit[edge[i].v ]) { LOW[x]=min(LOW[x],DFN[edge[i].v]); } } if(LOW[x]==DFN[x]) { do { printf("%d ",stack[index]); visit[stack[index]]=0; index--; } while(x!=stack[index+1]); printf(" "); } }