心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
判断一个有向图是否强连通。
以下是我的代码:
#include<list>
#include
<stack>
#include
<algorithm>
#include
<cstdio>
#include
<cstring>
using namespace std;
const int kMaxn(10007);

int n,m,n2,id[kMaxn];
list
<int> g[kMaxn];
int dfscnt,dfsn[kMaxn],low[kMaxn];
stack
<int> s;

void dfs(int u)
{
    dfsn[u]
=low[u]=++dfscnt;
    s.push(u);
    
for(list<int>::iterator i=g[u].begin();i!=g[u].end();i++)
    {
        
int v(*i);
        
if(!dfsn[v])
        {
            dfs(v);
            low[u]
=min(low[u],low[v]);
        }
        
else
            low[u]
=min(low[u],dfsn[v]);
    }
    
if(dfsn[u]==low[u])
    {
        n2
++;
        
int v;
        
do
        {
            v
=s.top();s.pop();
            id[v]
=n2;
        }
while(v!=u);
    }
}

void Tarjan()
{
    n2
=dfscnt=0;
    memset(dfsn,
0,kMaxn*sizeof(int));
    
for(int i=1;i<=n;i++)
        
if(!dfsn[i])
            dfs(i);
}

int main()
{
    
/*
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
    //
*/

    
while(scanf("%d%d",&n,&m)==2 && (n || m))
    {
        
for(int i=1;i<=n;i++)
            g[i].clear();
        
for(int i=1;i<=m;i++)
        {
            
int u,v;
            scanf(
"%d%d",&u,&v);
            g[u].push_back(v);
        }

        Tarjan();

        
if(n2==1)
            printf(
"Yes\n");
        
else
            printf(
"No\n");
    }

    
return 0;
}
posted on 2011-06-02 15:25 lee1r 阅读(433) 评论(0)  编辑 收藏 引用 所属分类: 题目分类:图论

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理