2020.10.28ユニバーサルグループ3(チームスクールネット)質問6(dfs)

シミュレーション3

6.人気

制限時間:5000MS
メモリ制限:256000KB

タイトルの説明
すべての牛には夢があります。グループで最も人気のある牛になることです。N(1 <= N <= 10,000)の牛がいる群れで、M(1 <= M <= 50,000)の2タプル(A、B)を与えます。これは、AがBが人気があると考えていることを示します。人気は譲渡可能であるため、AがBが人気であり、BがCが人気であると考える場合、これはあまり明確なルールではありませんが、AもCが人気であると考えます。あなたの仕事は、他のすべての牛に好かれている牛の数を数えることです。


最初の行、2つの数字、NとMを入力します。2〜M + 1行目は、各行にAとBの2つの数字があり、AがBが人気があると考えていることを示しています。


他のすべての牛に人気があると考えられる牛の数である数値を出力します。

入力サンプル
3

1 2

2 1

2 3

サンプル出力
1

この例は、
他のすべての牛が有名と見なしているのは3番牛だけであることを示しています。

ことを説明する
データが制限範囲
1 <= N <= 10,000。

1 <= M <= 50,000

問題解決のアイデア

つまり、暴力の各点DFSが
ポイントに達することができるようになります+ 1をし、
最終的に判断するのn-1ですどのように多くのポイント
。ポイント数がある答えは

ACコード

#include<cstdio>
#include<cstring>
using namespace std;
int n,m,tot,ans,c[10005],f[10005],head[10005];
struct node
{
    
    
	int to,next;
}a[50005];
void add(int x,int y)
{
    
    
	a[++tot]=(node){
    
    y,head[x]};
	head[x]=tot;
}
void dfs(int x)//dfs
{
    
    
	c[x]=1;//标记
	for(int i=head[x];i;i=a[i].next)
	 if(c[a[i].to]==0)
	 {
    
    
		f[a[i].to]++;
		dfs(a[i].to);
	 }
	return;
}
int main()
{
    
    
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
    
    
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);//建单向图
	}
	for(int i=1;i<=n;i++)
	{
    
    
		memset(c,0,sizeof(c));
		dfs(i);//暴搜
	}
	for(int i=1;i<=n;i++)
	 if(f[i]==n-1)ans++;//求点的数量
	printf("%d",ans);
	return 0;
}

ありがとうございました

おすすめ

転載: blog.csdn.net/weixin_45524309/article/details/109397498