首先,如果是乙個有向無環圖,那麼答案就是沒有出度的那個點,並且如果有多個沒有出度的點,那麼也不會出現乙個點能被所有點『歡迎』
如果不是這樣乙個圖,那麼縮點就好。記錄一下每個縮的點的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。但是我們發現,這道題...