程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> The Bottom of a Graph 強連通分量加縮點

The Bottom of a Graph 強連通分量加縮點

編輯:C++入門知識

[cpp]
/*題意比較晦澀,大致就是求一個圖縮點後出度為0的點的個數。*/ 
 
#include <stdio.h> 
#include <cstring> 
#include <vector> 
#include <iostream> 
using namespace std; 
vector<int> e[5010]; 
int dfn[5001]; 
int low[5001]; 
int stack[5001]; 
bool instack[5001]; 
int belong[5001]; 
int out[5001]; 
int n,m,num,top,cnt; 
void tarjan(int u) 

    int j; 
    stack[top++]=u; 
    low[u]=dfn[u]=++num; 
    instack[u]=true; 
    for(int i=0; i<e[u].size(); i++) 
    { 
        int v=e[u][i]; 
        if(!dfn[v]) 
        { 
            tarjan(v); 
            low[u]=min(low[v],low[u]); 
        } 
        else if(instack[v]) 
            low[u]=min(dfn[v],low[u]); 
    } 
    if(low[u]==dfn[u]) 
    { 
        cnt++; 
        do 
        { 
            j=stack[--top]; 
            instack[j]=false; 
            belong[j]=cnt; 
        } 
        while(j!=u); 
    } 

int main() 

    while(scanf("%d",&n)==1) 
    { 
        if(n==0) break; 
        scanf("%d",&m); 
        int a,b; 
        for(int i=1; i<=n; i++) 
            e[i].clear(); 
        top=0; 
        num=0; 
        cnt=0; 
        while(m--) 
        { 
            scanf("%d%d",&a,&b); 
            e[a].push_back(b); 
        } 
        memset(low,0,sizeof(low)); 
        memset(dfn,0,sizeof(dfn)); 
        memset(instack,false,sizeof(instack)); 
        memset(belong,0,sizeof(belong)); 
        for(int i=1; i<=n; i++) 
        { 
            out[i]=0; 
            if(!dfn[i]) 
                tarjan(i); 
        } 
        for(int i=1; i<=n; i++) 
        { 
            int len=e[i].size(); 
            for(int j=0; j<len; j++) 
            { 
                if(belong[i]!=belong[e[i][j]]) 
                    out[belong[i]]++; 
            } www.2cto.com
        } 
        int k=0; 
        for(int i=1; i<=n; i++) 
        { 
            if(out[belong[i]]==0) 
            { 
                if(k++) printf(" "); 
                printf("%d",i); 
            } 
        } 
        printf("\n"); 
    } 
    return 0; 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved