洛谷 P2341 受歡迎的牛(tarjan縮點)

2021-10-05 11:27:14 字數 2465 閱讀 1811

題目鏈結

思路:因為n是1e4,所以floyd求傳遞閉包肯定是不行的,二維陣列都開不了這麼大,複雜度也不對,然後就學了下tarjan縮點,因為每個強連通分量裡的每個牛肯定是互相喜歡的,所以我們要找強連通分量出度為0的那一團。

1.只找到一團出度為0的強連通分量,答案就是那一團的大小。

2.找到0或多團強連通分量,答案是0,因為他們不互相喜歡,也就是不是所有的牛都喜歡他。

#include

#define eb emplace_back

#define mp make_pair

#define mt make_tuple

#define fi first

#define se second

#define pb push_back

#define all(x) (x).begin(), (x).end()

#define rall(x) (x).rbegin(), (x).rend()

#define forn(i, n) for (int i = 0; i < (int)(n); ++i)

#define for1(i, n) for (int i = 1; i <= (int)(n); ++i)

#define ford(i, a, b) for (int i = (int)(a); i >= (int)b; --i)

#define fore(i, a, b) for (int i = (int)(a); i <= (int)(b); ++i)

#define rep(i, l, r) for (int i = (l); i <= (r); i++)

#define per(i, r, l) for (int i = (r); i >= (l); i--)

#define ms(x, y) memset(x, y, sizeof(x))

#define sz(x) ((int)(x).size())

using

namespace std;

typedef pair<

int,

int> pii;

typedef vector<

int> vi;

typedef vector vpi;

typedef vector vvi;

typedef

long

long i64;

typedef vector vi64;

typedef vector vvi64;

typedef pair pi64;

typedef

double ld;

template

<

class

t>

bool

uin(t &a, t b)

template

<

class

t>

bool

uax(t &a, t b)

const

int maxn =

(int

)1e4

+1000

;//點數

int scc, top, tot;

vector<

int> g[maxn]

;int low[maxn]

, dfn[maxn]

, belong[maxn]

;int stk[maxn]

, vis[maxn]

;int sz[maxn]

, out[maxn]

;void

init

(int n)

scc = top = tot =0;

}void

tarjan

(int x)

else

if(vis[to])}

if(low[x]

== dfn[x]

)while

(temp != x);}

}int n, m;

intmain()

for1

(i, n)if(

!dfn[i]

)tarjan

(i);

for1

(i, n)

}int cnt =

0, ans =0;

for1

(i, scc)}if

(cnt ==

1) cout << ans <<

'\n'

;else cout <<

0<<

'\n'

;#ifdef local_define

cerr <<

"time elapsed: "

<<

1.0*

clock()

/ clocks_per_sec <<

" s.\n"

;#endif

return0;

}

洛谷 P2341 受歡迎的牛

畫一張圖形象一下 tarjan演算法模板,這裡用於縮點 1931 else if col k 3235 36 if low u dfn u 3746 pru.pop 47 48return 49 50signed main 5158 for register int i 1 i n i 5964 6...

洛谷P2341 受歡迎的牛

usaco03fall haoi2006 受歡迎的牛 g 洛谷 電腦科學教育新生態 luogu.com.cn 用 tarjan 縮點後,在每個強連通分量中的點都可以互相到達。在 dag 中 如果有大於 1 個出口,則兩個出口之間肯定不能相互到達,所以沒有明星 如果只有乙個出口,則別的點一定可以到出口...

洛谷P2341(受歡迎的牛)題解

題目描述 每頭奶牛都夢想成為牛棚裡的明星。被所有奶牛喜歡的奶牛就是一頭明星奶牛。所有奶 歡b,b喜歡c,那麼a也喜歡c。牛欄裡共有n 頭奶牛,給定一些奶牛之間的愛慕關係,請你 算出有多少頭奶牛可以當明星。輸入輸出格式 輸入格式 第一行 兩個用空格分開的整數 n和m 第二行到第m 1行 每行兩個用空格...