題意 : 乙個有向圖 , 如果乙個點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對這樣的 認為.的關係,問有多少只奶牛被除其本身以外的所有奶牛關注。思路 既然有單向傳遞關係,那麼關係圖可能就形成了...