寻找预言家(暴力)

题目描述
在神秘小镇里,一共有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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章