题目的描述如下所示:
输入输出要求如下:
我写的C语言程序如下所示:
#include <stdio.h>
#include <malloc.h>
#define MAXn 1000
void manager(int *rt,int N,int M){
/*
根据输入人数和认识关系数,得出满足条件的镇长个数和镇长编号
这里我把镇长个数放在了数组的最后,便于计算
*/
int i,j,k=0;
int **cc=(int**)malloc(sizeof(int*)*N);
for(i=0;i<N;i++){
cc[i]=(int*)malloc(sizeof(int)*N);
rt[i]=0;
}
for(i=0;i<N;i++)
for(j=0;j<N;j++){
if(i==j) cc[i][i]=1;
else cc[i][j]=0;
}
for(i=0;i<M;i++){
int tmp1,tmp2;
scanf("%d %d",&tmp1,&tmp2);
cc[tmp1-1][tmp2-1]=1;
}
/*如果A除自己外不认识其他任何人,其他所有人都认识A,那A就可以是镇长*/
for(i=0;i<N;i++){
int t1=0,t2=0;
for(j=0;j<N;j++){
if(cc[j][i]==0) t1=1;
}
for(j=0;j<N;j++){
if(j!=i){
if(cc[i][j]==1) t2=1;
}
}
if(t1==0 && t2==0){
rt[k++]=i+1;
}
}
/*镇长个数放在最后*/
rt[k]=k;
for(i=0;i<N;i++)
free(cc[i]);
free(cc);
}
int main(){
int t;
scanf("%d",&t);
/*用来存放输入的人数和认识关系数*/
int **man=(int**)malloc(sizeof(int*)*t);
/*用来存放每一次的结果一共是t个*/
int **result=(int**)malloc(sizeof(int*)*t);
int i,j,k;
for(i=0;i<t;i++){
man[i]=(int *)malloc(sizeof(int)*2);
}
for(i=0;i<t;i++){
scanf("%d %d",&man[i][0],&man[i][1]);
result[i]=(int *)malloc(sizeof(int)*man[i][0]);
manager(result[i],man[i][0],man[i][1]);
}
for(i=0;i<t;i++){
j=0;
while(result[i][j]!=0) j++;
if(j==0){
printf("0\n\n");
}else{
printf("%d\n",result[i][--j]);
for(k=0;k<j;k++){
printf("%d ",result[i][k]);
}
printf("\n");
}
}
for(i=0;i<t;i++){
free(result[i]);
free(man[i]);
}
free(man);
free(result);
return 0;
}
有错误的地方,还请指正