【2020.10.28SSL普及シミュレーショントーナメントT6】【人気牛】【DFS】

タイトル説明

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

入る

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

出力

数、他のすべての牛に人気があると考えられている牛の数。

入力サンプル

3
1 2
2 1
2 3

サンプル出力

1

サンプル概要

3番牛は、他のすべての牛に有名と見なされている唯一の牛です。

説明

データ範囲の制限
1 <= N <= 10、000 1 <= N <= 10,0001<=N<=1 0 0 0 0
1 <= M <= 50、000 1 <= M <= 50,0001<=M<=5 0 0 0 0

分析

O(n 2)O(n ^ 2) O n2私になれる100万人以上!

端を隣接するテーブルに直接接続し、それにリンクされている各牛を検索します。数がn-1に達すると、taが人気のある牛であることを意味します。
次に、それをans配列に追加し、最後にans配列をカウントします

コードをアップロード

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

int n,m,v[100001],ans[100001],s;
int h[100001],tot;

struct node
{
    
    
	int x,y;
}e[100001];

void add(int x,int y)
{
    
    
	tot++;
	e[tot].x=y;
	e[tot].y=h[x];
	h[x]=tot;
}

void dfs(int x)
{
    
    
	v[x]=1;
	for(int i=h[x];i>0;i=e[i].y)
	{
    
    
		int t=e[i].x;
		if(!v[t])
		{
    
    
			ans[t]++;
			dfs(t);
		}
	}
}

int main()
{
    
    
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
    
    
		int a,b;
		cin>>a>>b;
		add(a,b);
	}
	for(int i=1;i<=n;i++)
	{
    
    
		memset(v,0,sizeof(v)); 
		dfs(i);
	}
	for(int i=1;i<=n;i++)
	{
    
    
		if(ans[i]==n-1) s++;
	}
	cout<<s;
	return 0;
}

AKはこの質問をスムーズに終えました。

おすすめ

転載: blog.csdn.net/dglyr/article/details/109352409