poj 2553 強連通縮點出度為0

2021-06-27 09:04:28 字數 1486 閱讀 9527

題意 :   乙個有向圖  , 如果乙個點u能夠達到點v, v也能到達u, 則u是sink點 ;  找出所有的sink  ,按順序輸入  ;

注意 如果點u能夠到達的所有點中,有乙個點不能到達u , u就不算是sink ,必須所有的點都能夠達到u  ;

第二組資料  :     1 --> 2   

1 能到達的點事  1 , 2  

但2不能到達1  , 所以1不是sink  

2能夠到達的點 是 2 ;

且2也能夠到達2 ; 所有2是sink  ;

分析  :    求一遍 強連通分量  ,  顯然 , 在乙個強連通分量的所有點 ,都是sink  ,  並且這個強連通分量是出度為0 的  ;  

#include#include#include#include#include#include#include#include #include#includeusing namespace std ;

const int n=5555 ;

const int m=5000000;

struct node

edge[m];

int head[n],dfn[n],low[n],vist[n],belong[n],out[n],stack[n],ans[n];

int top ,sum,cnt,dep;

void add(int u ,int v )

void tarjan(int u)

else if(vist[v])

low[u] = min( low[u] , dfn[v]) ;

} if(dfn[u] == low[u])

while(x!=u); }}

int main()

memset(low,0,sizeof(low));

memset(dfn,0,sizeof(dfn)) ;

memset(vist,0,sizeof(vist));

memset(belong,0,sizeof(belong)) ;

memset(out,0,sizeof(out)) ;

for(int i = 1 ; i <= n ; i++)

if(!dfn[i])

tarjan(i) ;

// printf("%d ",sum);

for(int i = 1 ; i <= n ; i++)

for(int j = head[i] ; j!=-1 ; j=edge[j].next)

}int k = 0 ;

for(int i = 1 ; i <= n ; i++)

}

printf("%d",ans[0]) ;

for(int i = 1 ; i < k ; i++)

printf(" %d",ans[i]);

puts("") ;

} return 0 ;

}

poj 2553強連通 縮點

先吐槽下,剛開始沒看懂題,以為只能是乙個連通圖0t0 題意 給你乙個有向圖,求g圖中從v可達的所有點w,也都可以達到v,這樣的v稱為sink.求這樣的v.解 求強連通 縮點。求所有出度為0的點即為要求的點。注意 可能有多個聯通分支。include include include define n 5...

poj 2553 強連通分支 出度為0的點

題目大意 題目分析 實現 c include include include include includeusing namespace std define max node 5005 define min a,b a b?a b define max a,b a b?a b vectorggr...

poj 2186 強連通縮點

題意 有n只奶牛,奶牛有自己認為最受歡迎的奶牛。奶牛們的這種 認為 是單向可傳遞的,當a認為b最受歡迎 b不一定認為a最受歡迎 且b認為c最受歡迎時,a一定也認為c最受歡迎。現在給出m對這樣的 認為.的關係,問有多少只奶牛被除其本身以外的所有奶牛關注。思路 既然有單向傳遞關係,那麼關係圖可能就形成了...