中南大學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;
}