#include<bits/stdc++.h>
using namespace std;
int n;
int findKnown(bool relation[][10]){
//relation代表了n个人的关系,为一个NxN的方阵
//relation[i][j] 代表从i到j是否有边,有边为true,无边为false
int i;
//第一阶段
int can; // 候选人
stack<int> candidate ;
for(i = 0; i < n ; i++){
candidate.push(i);
}
can = candidate.top();candidate.pop();
while(candidate.size() > 0){
int temp = candidate.top();candidate.pop();
if(relation[can][temp]){
//从can到temp有边,删除can
can = temp;///其实就是到对应行的位置上向左遍历,不用向右,因为之前如果有“社会名流",则会先到其他的点
}
//无边can保持原值
}
//得到can,进入检测其是不是真的社会名流
for(i = 0 ; i < n ; i++){
if(i == can)
continue;
if(relation[i][can] == true && relation[can][i] == false){
continue;
}else{
return -1;
}
}
return can;
}
int main(){
while(true)
{cin>>n;
bool g[10][10];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>g[i][j];
cout<<"ans:"<<findKnown(g);}
}
这道题规定不能直接输入时计算出入度 。抽象出来就是问,一个邻接矩阵上是否存在这样一个点,除了自己到自己的点外,行全为0,列全为1.