求强连通分量算法分析-未完成
代码思路来自挑战程序设计
学到了一些问题的解决方式,以及编码实现的方案和技巧
理解一个算法,首先要会构造各种类型的数据,还要能手玩出来,这样才能快速懂
下面是我还没校验的代码。。明天A个题试试
#include <iostream> #include <vector> // struct node{ // } // std::vector<node> edge; const int maxn=1e5+7; int n,time,V;//time 其实不需要 std::vector<int> edge[maxn]; std::vector<int> redge[maxn]; std::vector<int> vs[maxn]; bool vis[maxn]; int col[maxn];//染色标记集合 void addEdge(int u,int v){ edge[u].push_back(v); redge[v].push_back(u); } void dfs(int v){ register int i; for(i=0;i<edge[v].size();++i){ if(!vis[edge[v][i]]){ vis[edge[v][i]]=true; dfs(edge[v][i]); } } vs.push_back(v); } void rdfs(int v,int color){ register int i; vis[v]=true; col[v]=color; for(i=0;i<redge[v].size();++i){ if(!vis[redge[v][i]]){ vis[redge[v][i]]=true; rdfs(redge[v][i],color); } } } int scc(){ //返回强连通分量的个数 memset(vis,0,sizeof(vis)); //先dfs回溯标号 //V表示最大节点的标号 register int i; //给所有点标号 for(i=0;i<V;++i){ if(!vis[i]) dfs(i); } memset(vis,0,sizeof(vis)); int color=0; for(i=vs.size()-1;i>=0;--i){ if(!vis[vs[i]]){ rdfs(vs[i],color++); } } return color; } int main(){ scanf("%d",&n); return 0; }