ural Team building(強連通分支)

2022-05-23 22:54:09 字數 1315 閱讀 9611

寒假集訓已經開始幾天了,直到搬完宿舍才感覺安定下來,開始靜下心了認真學習演算法,這幾天心無旁騖的學習,效率自然提了上來,感覺以前不熟的演算法或是沒想透的地方在做過兩道題後都可以理解了,好好利用這十幾天的集訓,提高一下自己的水平吧~

題意:it公司有n名程式設計師,他們都認為自己是最優秀或第二優秀的程式設計師,公司的管理者打算將他們分到不同的開發小組裡,分配的條件如下:

(1、任意選出一名未被分配的程式設計師,然後給他建立乙個開發小組,他作為當前程式設計師。

(2、如果在他的同事中,他認為這個人比他優秀,那麼這個比他優秀的人就不能被分配到其他小組,只能分配到這個小組,成為這個小組的當前程式設計師。

題目要求這n名程式設計師最多和最少可以分配到多少個開發小組中。

思路:如果a認為b比他強,那麼a到b有一條有向邊,如果乙個人的入度為0,就是沒有人認為他比他強,那麼就從這個人搜起,依次往下,直到搜到乙個已經搜過的。如果這個搜過的人是這個小組的,那麼這是乙個環,除了環裡的,其他的都可以自己乙個人建立乙個開發小組,也可以與環裡的人在同乙個小組。如果搜過的這個人不是這個小組的,那麼所有搜過的人都可以自己建立乙個小組。

**:view code

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define n 100003

using

namespace

std ;

intnexts[n] , vist[n] , cnt[n] ;

int n , in

[n] ;

int dfs( int

x )

else

}x =nexts[x] ;

}}int

main()

memset( vist ,

0 , sizeof

( vist )) ;

memset( cnt ,

0 , sizeof

( cnt )) ;

min_s = 0 ; max_s = 0

;

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

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

}printf (

"%d %d\n

", min_s , max_s ) ;

}return0;

}

強連通分量 tarjan求強連通分量

雙dfs方法就是正dfs掃一遍,然後將邊反向dfs掃一遍。挑戰程式設計 上有說明。雙dfs 1 include 2 include 3 include 4 include 5 6using namespace std 7const int maxn 1e4 5 8 vector g maxn 圖的鄰...

強連通分量

對於有向圖的乙個頂點集,如果從這個頂點集的任何一點出發都可以到達該頂點集的其餘各個頂點,那麼該頂點集稱為該有向圖的乙個強連通分量。有向連通圖的全部頂點組成乙個強連通分量。我們可以利用tarjan演算法求強連通分量。define n 1000 struct edge e 100000 int ec,p...

強連通分量

在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected components 下圖中,子圖為乙個強連通分量,因為...