题目描述
在神秘小镇里,一共有N个人。他们的编号为1 —— N。
传说中,这些人中有一个是小镇上的预言家,可以在末日来临时拯救大家。
由于这个传说非常古老,没有人知道它是否是真实的。现在请你来帮帮忙,查探一下小镇中是否存在预言家。
如果小镇的预言家真的存在,那么他有几个特点:
1.小镇的预言家不相信任何人。
2.每个人(除了小镇预言家外)都信任小镇的预言家。
3.只有一个人同时满足属性 1 和属性 2 。
如果小镇存在预言家并且可以确定他的身份,请返回该预言家的编号。否则,返回 -1。
输入
输入样例由多组测试数据组成,第一行输入两个整数N( 1 <= N <= 1000 ) 和 M ( 1 <= M <= 10000 )分别代表小镇的人数和关系数
接下来M行,每行输入两个整数 a ( 1 <= a <= N ) 和 b ( 1 <= b <= N ) ,表示编号为A的人信任编号为B的人。
输出
输出预言家的编号,如果不存在,则输出-1
样例输入 Copy
4 5
1 3
1 4
2 3
2 4
4 3
2 1
1 2
3 3
1 3
2 3
3 1
样例输出 Copy
3
2
-1
解题思路
将所有的A都标记一下,最后找出一个没有在A位置出现过的人,在找出与他相对的出现在A位置的人数是不是有n-1个人,且这个人是唯一的,那这个人就是预言师,否则就输出-1.
#include<bits/stdc++.h>
using namespace std;
int v[1005];
vector<int>q[1005];
int main(){
int n,m,i,a,b,sum,len,k;
while(~scanf("%d%d",&n,&m)){
for(i=1;i<=n;i++){
v[i]=0;
q[i].clear();
}
for(i=0;i<m;i++){
scanf("%d%d",&a,&b);
v[a]=1;
q[b].push_back(a);
}
sum=0;
for(i=1;i<=n;i++){
len=q[i].size();
if(v[i]==0 && len==n-1){
sum++;
k=i;
}
}
if(sum==1) printf("%d\n",k);
else printf("-1\n");
}
return 0;
}