洛谷P2341 HAOI2006 受歡迎的牛

2021-09-29 07:58:12 字數 1453 閱讀 6977

tarjan縮點,重建圖;

自己的做法有點麻煩,其實只要記錄縮點後出度為0的點裡面有多少個點就可以了;

如果存在多個出度為0的點,那麼就輸出0;

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

const int maxn = 100001;

int low[maxn],num[maxn],s[maxn],scc[maxn],fa[maxn];

int dfn,n,m,top,ans,cnt,tot;

bool vis[maxn];

vectorg[maxn],g[maxn];

void tarjan(int x)

else if(!scc[v])

low[x] = min(num[v],low[x]);

} if(num[x] == low[x])

} return;

}void dfs(int x)

} return;

}void solve()

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

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

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

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

if(fa[scc[i]] == cnt - 1)

ans ++;

cout << ans << endl;

return;

}int main()

改進後

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

const int maxn = 100001;

int low[maxn],num[maxn],s[maxn],scc[maxn],fa[maxn],chu[maxn];

int dfn,n,m,top,ans,cnt,tot;

vectorg[maxn];

void tarjan(int x)

else if(!scc[v])

low[x] = min(num[v],low[x]);

} if(num[x] == low[x])

} return;

}void solve()

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

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

} }int pos = 0,ccnt = 0;

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

if(!pos || ccnt >= 2) cout <<"0";

else

cout << ans

}int main()

洛谷 P2341 HAOI2006 受歡迎的牛

a 喜歡 b,b 喜歡 c,那麼 a 也喜歡 c。牛欄裡共有 n 頭奶牛,給定一些奶牛之間的愛慕關係,請你算出有多少頭奶牛可以當明星。輸入格式 第一行 兩個用空格分開的整數 n和 m 第二行到第 m 1行 每行兩個用空格分開的整數 a 和 b,表示 a 喜歡 b 輸出格式 第一行 單獨乙個整數,表示...

洛谷P2341 HAOI2006 受歡迎的牛

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

洛谷P2341 HAOI2006 受歡迎的牛

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