360员工桂最近申请了一个长假,一个人背着包出去自助游了。
路上,他经过了一个小镇,发现小镇的人们都围在一棵树下争吵。桂上前询问情况,得知小镇的人们正缺一个镇长,他们希望能选一个知名又公正的镇长,即,大家希望能选出一个人,所有人都认识他,但同时他不认识镇上除自己以外的其他人(在此,我们默认每个人自己认识自己)。可是小镇里的人太多了,一下子大家谁也说服不了谁。
“这简单啊。”桂表示。于是他一下子统计出来了镇上人们相互之间的认识关系,并且一下子找到了合适的镇长人选。
路上,他经过了一个小镇,发现小镇的人们都围在一棵树下争吵。桂上前询问情况,得知小镇的人们正缺一个镇长,他们希望能选一个知名又公正的镇长,即,大家希望能选出一个人,所有人都认识他,但同时他不认识镇上除自己以外的其他人(在此,我们默认每个人自己认识自己)。可是小镇里的人太多了,一下子大家谁也说服不了谁。
“这简单啊。”桂表示。于是他一下子统计出来了镇上人们相互之间的认识关系,并且一下子找到了合适的镇长人选。
现在你手上也拿到了这样一份认识关系的清单。其中上面给出的认识关系是单向的,即,A认识B与B认识A是相互独立的,只给出A认识B就不能认为B认识A,例如,我认识你,你不一定认识我。而且,这里的认识关系也不具有传递性,即,A认识B,B认识C,但这不代表A认识C。同时,为了方便处理,这份清单中,镇上的N个人依次编号为1到N。你能否像桂一样快速找到合适的镇长人选呢?
镇长需要满足的要求就是:
1、所有人都认识镇长(入度=n-1)
2、镇长不认识任何人(出度=0)
使用2个长度为100的数组,来分别统计每个人的出度和入度。
另外,注意碰到自己认识自己的输入,直接跳过即可。
#include<iostream>
#include<string>
using namespace std;
void main(){
cout << "请输入用例组数:" << endl;
int T;//T为组数,用例数量
cin >> T;
while (T--){
cout << "请输入人数与关系数:" << endl;
int n, m;//n为每组的人数,m为关系数;
cin >> n >> m;
int *cd = new int[n];//出度
int *rd=new int[n];//入度
int *zz=new int[n];//记录村长数
for (int i = 0; i <= n; i++){
cd[i] = 0;
rd[i] = 0;
zz[i] = 0;
}
for (int k = 0; k < m; k++){
int i, j;//i,j应都小于等于n
cin >> i >> j; //i与j不相等的话,i的出度加1,j的入度加1;
if (i == j)
continue;//跳过本次循环
cd[i] += 1;
rd[j] += 1;
}
int count = 0;//记录村长的个数,每组不一定只有一个村长
for (int k = 1; k <= n; k++){ //分析每个人的入度出度,判断是否符合村长
if ((cd[k] == 0) && (rd[k] == n - 1))
zz[++count] = k;
}
cout << "合适的村长为数目:"<<count<<endl;
for (int l = 1; l <=count; l++){ //输入一组用例,就输出结果。
cout << zz[l];
if (l != count - 1)
cout << " "; //保证最后一个数字不输出空格
}
cout << endl;
}
cout << endl;
system("pause");
}