bzoj1501受歡迎的牛(強聯通分量 縮點)

2021-07-22 03:39:50 字數 1337 閱讀 3328

首先,如果是乙個有向無環圖,那麼答案就是沒有出度的那個點,並且如果有多個沒有出度的點,那麼也不會出現乙個點能被所有點『歡迎』

如果不是這樣乙個圖,那麼縮點就好。記錄一下每個縮的點的size,每個點屬於的聯通分量就好,注意一下沒有答案的情況就好

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

const int n=12005;

int n,m;

int head[n],to[n*8],pre[n*8],tot;

int dfn[n],low[n],id,cn[n],size[n],ans;

stacks;

bool ins[n],tt[n];

void addedge(int x,int y)

void dfs(int u)

else if (ins[to[i]]) low[u]=min(low[u],dfn[to[i]]);

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

s.pop();

cn[u]=ans;

size[ans]++;

ins[u]=false; }}

int main()

for (int i=1;i<=n;i++) if (!dfn[i]) dfs(i);

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

for (int j=head[i];j;j=pre[j])

if (cn[i]!=cn[to[j]])

int ans2=0,kk=0;

for (int i=1;i<=ans;i++) if (tt[i]==false) ans2=size[i],kk++;

if (kk>1||kk==0) printf("0");else printf("%d",ans2);

return 0;

}

總結

1:關於設計變數名,是對於debug非常關鍵的,盡量的變數名可以通俗易理解點,並且變數名不是相似意義的變數名不要太相近。這道題ans1就打成ans,這點要注意

2:分析問題的時候還是要再三考慮,這題當中,剛開始就沒有考慮到兩個沒有出度的點答案是0的情況。。分析問題還是不夠全面,注意就好,形成再三思索的習慣

3:圖的東西如果不好解決,可以嘗試縮點(有向圖將每個強連通分量看成乙個點,無向圖將每個雙連通分量看成乙個點),縮點之後圖就變成dag無向無環連通圖,原本沒有的一些性質就會在這是凸顯出來,而且縮點的複雜度很低。

其實就這題而言,無環圖很好做,這裡就是通過上面說的縮點來轉化為無環圖來做的。

BZOJ 1051, 受歡迎的牛

傳送門 求可以被除自己以外所有點遍歷到的點的個數。首先強連通分量跑一遍,縮點之後統計每個強連通分量 可以視為乙個點 的出度。如果有多個出度大於0,則無解 否則輸出唯一出度為0的強連通分量內點的個數。include const int n 10005,m 50005 int n,m,x,y,i,j,t...

bzoj1051 受歡迎的牛

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

受歡迎的牛

題目大意 給你n個點,m條單項邊,求可以和所有點聯通的點的個數。注釋 n 10,000,m 50,000 想法 這題也是一道tarjan裸題,讓我來a掉吧!這題和愛在心中 愛在心中?猛戳 類似,只不過這題有坑.用panxf的模板a不掉這道題.為什麼呢?因為n的資料範圍,會mle。但是我們發現,這道題...