尋找預言家(暴力)

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