HAOI2006 受歡迎的牛

2022-02-28 15:07:50 字數 1680 閱讀 2285

1051: [haoi2006]受歡迎的牛time limit: 10 sec memory limit: 162 mb

submit: 7267 solved: 3868

[submit][status][discuss]

每一頭牛的願望就是變成一頭最受歡迎的牛。現在有n頭牛,給你m對整數(a,b),表示牛a認為牛b受歡迎。 這

種關係是具有傳遞性的,如果a認為b受歡迎,b認為c受歡迎,那麼牛a也認為牛c受歡迎。你的任務是求出有多少頭

牛被所有的牛認為是受歡迎的。

第一行兩個數n,m。 接下來m行,每行兩個數a,b,意思是a認為b是受歡迎的(給出的資訊有可能重複,即有可

能出現多個a,b)

乙個數,即有多少頭牛被所有的牛認為是受歡迎的。

3 31 2

2 12 3

100%的資料n<=10000,m<=50000

不是一道很難的題,很容易看出來的是這個題首先就要tarjan縮點,關鍵在於縮完點之後要怎麼辦,可以發現的是,如果這個圖中有兩個及以上出度為0的強連通分量,那麼這個圖裡面就一定沒有受歡迎的奶牛。那麼直接記錄圖里出度為0的強連通分量是否多於乙個就可以了。個數可以在跑tarjan的時候記錄。一開始tarjan寫錯了居然找了半個小時

#pragma comment(linker, "/stack:1024000000,1024000000")

#include #include #include #include #include #include #include #include #include #include #define re register

#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a)<(b)?(a):(b))

#define maxn 1000007

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

#define ms(arr) memset(arr, 0, sizeof(arr))

const int inf = 0x3f3f3f3f;

struct po

;po edge[maxn];

int n,m,dfn[maxn],low[maxn],col[maxn],stack[maxn],vis[maxn],tot[maxn];

int head[maxn],num,color_num,s,tp,cnt,cd[maxn],flag,ans;

inline int read()

inline void add_edge(int from,int to)

inline void tarjan(int u)

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

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

tp--;

}}int main()

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

if(!dfn[i]) tarjan(i);

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

}for(re int i=1;i<=color_num;i++)

}cout

}

HAOI2006 受歡迎的牛

題目 分析 tarjan縮點。最後如果只有乙個出度為0的點,則答案就是這個點包含的牛數,否則為0.一開始最後統計的時候寫了dfs,後來發現是錯誤的,反例 include include include include include using namespace std const int tma...

HAOI2006 受歡迎的牛

這個就是強連通,計算出度為0的點就好 也沒森麼其它好講的啦 提交傳送們 description 每一頭牛的願望就是變成一頭最受歡迎的牛。現在有n頭牛,給你m對整數 a,b 表示牛a認為牛b受歡迎。這種關係是具有傳遞性的,如果a認為b受歡迎,b認為c受歡迎,那麼牛a也認為牛c受歡迎。你的任務是求出有多...

HAOI2006 受歡迎的牛

haoi2006 受歡迎的牛 每一頭牛的願望就是變成一頭最受歡迎的牛。現在有n頭牛,給你m對整數 a,b 表示牛 a 認為牛 b受歡迎。這種關係是具有傳遞性的,如果a認為b受歡迎,b認為c受歡迎,那麼牛a也認為牛c受歡迎。你的任務是求出有多少頭牛被所有的牛認為是受歡迎的。第1行兩個整數n,m 接下來...