POPULAR

POPULARPOPULAR

題目鏈接:SSL比賽 1407

題目

每頭牛都有一個夢想:成爲一個羣體中最受歡迎的名牛!在一個有NN頭牛的牛羣中,給你MM個二元組(A,B)(A,B),表示AA認爲BB是受歡迎的。既然受歡迎是可傳遞的,那麼如果AA認爲BB受歡迎,BB又認爲CC受歡迎,則AA也會認爲CC是受歡迎的,哪怕這不是十分明確的規定。你的任務是計算被所有其它的牛都喜歡的牛的個數。

輸入

第一行,兩個數,NNMM。第2M+12~M+1行,每行兩個數,AABB,表示AA認爲BB是受歡迎的。

輸出

一個數,被其他所有奶牛認爲受歡迎的奶牛頭數。

樣例輸入

3 3
1 2
2 1
2 3

樣例輸出

1

樣例解釋

33號奶牛是唯一被所有其他奶牛認爲有名的。

數據範圍

1<=N<=10,0001<=N<=10,000
1<=M<=50,0001<=M<=50,000

思路

這道題就是一道dfsdfs
我們用鄰接表儲存之後,就從每一個點開始dfsdfs,給每一個它喜歡的點標記。
最後我們看看有多少個點有被標記n1n-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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章