中南大學ACM的暑期集訓馬上就要開始了,這次集訓會將全體N名集訓隊員(編號分別為1, 2, …, N)按集訓選拔賽的排名分成兩組,前K名隊員分入A組,其餘隊員分入B組。

但現在助理教練CSGrandeur一不小心把集訓選拔賽的排名弄丟了,而之前又沒將A組和B組的人員確定出來,於是CSGrandeur打算問一下集訓人員他們的名次各是怎樣的,以此來確定一下A組的隊員。

然而集訓隊員們都視名次如糞土,只是隱約記得某些人排在了自己的後面,最終反饋到CSGrandeur這裏的一共有M條信息,每條信息都可以用一個二元組(x, y) (x!=y)表示,含義為第x名隊員記得第y名隊員的排名比自己的要靠後。

現在CSGrandeur想知道,根據這M條信息,是否可以確定出A組的隊員呢?(默認所有集訓隊員反映的信息都是符合事實的。)

Input

輸入包含多組測試數據。

對於每組測試數據,第一行包含三個正整數N (2<=N<=1000)、K (1<=K<=N)、M (1<=M<=10000),含義同上。接下來M行每行有兩個正整數x、y (1<=x, y<=N且x!=y),分別描述了M條信息,對於每對x、y,均表示第x名隊員記得第y名隊員的排名比自己的要靠後。

Output

對於每組測試數據,如果可以確定出A組的隊員,輸出“YES”(不包括引號),否則輸出“NO”(不包括引號)。

Sample Input

3 1 21 21 33 2 21 21 3

Sample Output

YESNO

思路:能確定為屬於A組的k個成員  就是説至少有n-k個人排名在這個人後面,所以只要判斷每個人後面是否存在至少n-k個人即可,

bfs加鄰接表

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
int vis[1010];
vector<int> v[1010];
int bfs(int index)
{
    queue<int> Q;
    memset(vis,0,sizeof(vis));
    int ans=0;
    Q.push(index);
    vis[index]=1;
    while(!Q.empty())
    {
        int xx=Q.front();
        Q.pop();
        for(int i=0;i<v[xx].size();i++)
        {
             int y=v[xx][i];
             if(!vis[y])
             {
                  ans++;
                  Q.push(y);
                  vis[y]=1;
             }
        }
    }
    return ans;
}
int main()
{
    int n,k,m;
    while(~scanf("%d %d %d",&n,&k,&m))
    {                     
        int x,y;
        for(int i=0;i<1010;i++)
        {
            v[i].clear();
        }
        memset(vis,0,sizeof(vis));
        for(int i=0;i<m;i++)
        {
            scanf("%d %d",&x,&y);
            v[x].push_back(y);
        }
        int sum=0;
        for(int i=1;i<=n;i++)
        {
            if(bfs(i)>=(n-k))
            {
                sum++;
            }
        }
        if(sum>=k)
        printf("YES\n");
        else
        printf("NO\n");
    } 
    return 0;
}