tarjan算法求连通分量+缩点后重新建图
来源:互联网 发布:js onclick function 编辑:程序博客网 时间:2024/06/06 18:10
#include<bits/stdc++.h>using namespace std;const int maxn=2e4+7;vector<int> g[maxn];vector<int> newp[maxn];int dfn[maxn],low[maxn],sccno[maxn];int idx=0;bool visit[maxn];stack<int> s;void tarjan(int u){ dfn[u]=low[u]=++idx; s.push(u); visit[u]=true; int v; for(int i=0;i<g[u].size();++i){ v=g[u][i]; if(dfn[v]==0){ tarjan(v); low[u]=min(low[u],low[v]); }else if(visit[v]) low[u]=min(low[u],dfn[v]); } if(dfn[u]==low[u]) do{ v=s.top(); s.pop(); sccno[v]=u;//缩点 visit[v]=false; }while(u!=v);}void suodian(int n){ int v,u; for(int i=1;i<=n;++i){ for(int j=0;j<g[i].size();++j){ u=g[i][j]; if(sccno[i]==u) continue; if(w[u]==0) continue; if(u!=sccno[u]){ w[sccno[u]]+=w[u]; w[u]=0; }else newp[sccno[i]].push_back(u); } }}int main(){ ios::sync_with_stdio(false); //freopen("in.txt","r",stdin); int n,m,u,v; memset(dfn,0,sizeof(dfn)); cin>>n>>m; for(int i=1;i<=n;++i) cin>>w[i]; for(int i=1;i<=m;++i){ cin>>u>>v; g[u].push_back(v); } for(int i=1;i<=n;++i) sccno[i]=i; tarjan(1); suodian(n); return 0;}
阅读全文
3 0
- tarjan算法求连通分量+缩点后重新建图
- 求图的所有强连通分量 ---- tarjan算法
- Tarjan 算法 求有向图强连通分量
- Tarjan算法求强连通分量
- 求强连通分量的Tarjan算法
- Tarjan算法-求强连通分量
- tarjan算法求强连通分量
- tarjan算法求强连通分量
- 求强连通分量之tarjan算法
- Tarjan算法(求强连通分量)
- tarjan算法求强连通分量
- tarjan算法----求强连通分量
- Tarjan算法求强连通分量总结
- Tarjan求强连通分量算法
- tarjan 算法(求强连通分量)
- 求强连通分量的Tarjan算法
- 求强连通分量的Tarjan算法
- tarjan 算法求强连通分量
- 可视化算法-开端
- 【矩阵】备用模板
- Merge Two Sorted Lists leetcode java
- linux gcc 静态编译和动态编译
- 基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN
- tarjan算法求连通分量+缩点后重新建图
- poj 1787 Charlie's Change【多重背包可行性+记录路径】
- 机器学习
- HDOJ1874 畅通工程续 (Dijkstra)
- HTTP,TCP,UDP,Socket,WebSocket
- 海明码校验
- 杭电acm 5687Problem C(字典树)
- .NET出现频率非常高的笔试题
- hdu1754 I Hate It 线段树