題目鏈接:SSL比賽 1407
題目
每頭牛都有一個夢想:成爲一個羣體中最受歡迎的名牛!在一個有頭牛的牛羣中,給你個二元組,表示認爲是受歡迎的。既然受歡迎是可傳遞的,那麼如果認爲受歡迎,又認爲受歡迎,則也會認爲是受歡迎的,哪怕這不是十分明確的規定。你的任務是計算被所有其它的牛都喜歡的牛的個數。
輸入
第一行,兩個數,和。第行,每行兩個數,和,表示認爲是受歡迎的。
輸出
一個數,被其他所有奶牛認爲受歡迎的奶牛頭數。
樣例輸入
3 3
1 2
2 1
2 3
樣例輸出
1
樣例解釋
號奶牛是唯一被所有其他奶牛認爲有名的。
數據範圍
思路
這道題就是一道。
我們用鄰接表儲存之後,就從每一個點開始,給每一個它喜歡的點標記。
最後我們看看有多少個點有被標記次,那些點就是其他的牛都喜歡的牛。最後,我們只要輸出這樣的點的數量,就可以了。
代碼
#include<cstdio>
#include<cstring>
using namespace std;
struct note {
int to, next;
}a[50001];
int n, m, x, y, k, le[50001], count[50001], ans;
bool in[50001];
void dfs(int now) {//dfs
in[now] = 1;//標記
for (int i = le[now]; i; i = a[i].next)
if (!in[a[i].to]) {
count[a[i].to]++;//記錄
dfs(a[i].to);
}
}
int main() {
scanf("%d %d", &n, &m);//讀入
for (int i = 1; i <= m; i++) {
scanf("%d %d", &x, &y);//讀入
a[++k] = (note){y, le[x]}; le[x] = k;//鄰接表儲存
}
for (int i = 1; i <= n; i++) {
memset(in, 0, sizeof(in));//初始化
dfs(i);//dfs
}
for (int i = 1; i <= n; i++)
if (count[i] == n - 1) ans ++;//記錄
printf("%d", ans);//輸出
return 0;
}