zoukankan      html  css  js  c++  java
  • 求强连通分量-korasaju算法

    基本思路

    两次dfs,第一次逆序,第二次计算连通分量的类别。待完善。
    
    #include<bits/stdc++.h>
    using namespace std;
    typedef struct{
    	int vertex,next;
    }NODE;NODE nodes[10010];
    int end[10010]={0},m,n,index,color[10010]={0},vis[10010]={0};
    vector<int>v;
    void dfs(int cur)
    {
    	//cout<<"cur="<<cur<<"index="<<index<<endl;
    	priority_queue<int,vector<int>,greater<int> >q; 
    	for(int i=0;i<m;i++)
    	{
    		if(nodes[i].vertex==cur)
    		{//当前顶点 
    			if(!vis[nodes[i].next])
    			{//未遍历
    				vis[nodes[i].next]=1;
    				q.push(nodes[i].next);
    			}
    		}
    	}
    	while(!q.empty())
    	{
    		end[q.top()]=index;
    		index--;
    		v.push_back(q.top());
    		dfs(q.top());
    		q.pop();
    	}
    }
    void dfs2(int cur)
    {
    	//cout<<"cur="<<cur<<"index="<<index<<endl;
    	priority_queue<int,vector<int>,greater<int> >q;
    	for(int i=0;i<m;i++)
    	{
    		if(nodes[i].vertex==cur)
    		{
    			if(vis[nodes[i].next]==1)
    			{
    				q.push(nodes[i].next);
    			}
    		}
    	}
    	vis[cur]=0;
    	color[cur]=index;
    	while(!q.empty())
    	{
    		dfs2(q.top());
    		q.pop();
    	}
    }
    int main()    
    {
    	cin>>n>>m;
    	for(int i=0;i<m;i++)
    	{//读取边 
    		cin>>nodes[i].vertex>>nodes[i].next;
    	}
    	index=n;
    	for(int i=1;i<=n;i++)
    	{
    		if(!vis[i])
    		{//未遍历 
    			vis[i]=1; 
    			end[i]=index;
    			index--;
    			v.push_back(i);
    			dfs(i);
    		}
    	}
    //	for(int i=1;i<=n;i++)
    //	{
    //		cout<<end[i]<<" ";
    //	}
    //	cout<<endl;
    //	for(vector<int>::iterator it=v.begin();it!=v.end();it++)
    //	{
    //		cout<<(*it)<<" ";
    //	}
    //	cout<<endl;
    	
    	for(vector<int>::iterator it=v.end()-1;it!=v.begin()-1;it--)
    	{//逆向遍历 
    		if(vis[(*it)]==1)
    		{
    			vis[(*it)]=0;
    			color[(*it)]=index;
    			index++;
    			dfs2((*it));
    		}
    	} 
    	cout<<"强连通分量:"<<endl;
    	stack<int>qlt[7];
    	for(int i=1;i<=n;i++)
    	{
    		qlt[color[i]].push(i);		
    	}
    	for(int i=1;i<=n;i++)
    	{
    		if(qlt[i].empty())continue;
    		else while(!qlt[i].empty())
    		{
    			cout<<qlt[i].top()<<" ";
    			qlt[i].pop();
    		}
    		cout<<endl;
    	}
    	return 0; 
    } 
    
  • 相关阅读:
    开发一款即时通讯App,从这几步开始
    即时通讯App怎样才能火?背后的技术原理,可以从这5个角度切入
    快速搭建一个“微视”类短视频 App
    iOS Push详述,了解一下?
    怒刷3000条短视频后,我终于发现网红300万点赞的套路
    如何精准实现OCR文字识别?
    30分钟彻底弄懂flex布局
    渲染管道
    游戏引擎架构Note2
    浮点数的内存表示方法
  • 原文地址:https://www.cnblogs.com/tldr/p/11144758.html
Copyright © 2011-2022 走看看