タイトル説明
すべての牛には夢があります。グループで最も人気のある牛になることです。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はこの質問をスムーズに終えました。