打了两种解法。
一开始我的想法和图论无关。由题意得,法官不指向任何人,但任何人都指向法官,且只有一个法官——即只有法官不信任任何人。因此我遍历一次找这个不信任任何人的人(这个人只能有一个,否则return -1),然后检查一遍是否每个人都信任他。时间复杂度$O(n)$。
bool flag[1007]; bool tag[1007][1007]; class Solution { public: int findJudge(int n, vector<vector<int>>& trust) { memset(flag,0,sizeof(flag)); memset(tag,0,sizeof(tag)); int ans=0; int t=trust.size(); for (int i=0;i<t;i++) // record whether one has someone to trust flag[trust[i][0]]=true,tag[trust[i][0]][trust[i][1]]=true; for (int i=1;i<=n;i++) // find possible judge if (!flag[i]){ if (ans) return -1; else ans=i; } if (!ans) // no judge return -1; else{ for (int i=1;i<=n;i++) if (i!=ans&&(!tag[i][ans])) return -1; return ans; } } };
然后看了题解之后发现从图论入手就很简单——直接找入度为$n-1$,出度为$0$的点就行了,时间复杂度也是$O(n)$。
int in[1007],out[1007]; class Solution { public: int findJudge(int n, vector<vector<int>>& trust) { int t=trust.size(); memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); for (int i=0;i<t;i++) out[trust[i][0]]++,in[trust[i][1]]++; int ans=0; for (int i=1;i<=n;i++) if (in[i]==n-1&&out[i]==0){ if (ans) return -1; else ans=i; } return ans?ans:-1; } };