名人问题/名流问题/Celebrity
问题描述:名人问题
一个名人就是指这样一个人:所有其他人都认识他,并且他不认识任何其他人。现在有一个N个人的集合,以及他们之间的认识关系。求一个算法找出其中的名人(如果有的话)或者判断出没有名人(如果没有的话)。
1.构造输入数据数组,名人所在的Index可控。
public static int[,] initCelebrityData(int size, int celebrateIndex) { int[,] arrray = new int[size, size]; Random rnd = new Random(DateTime.Now.Millisecond); for (int i = 0; i < size; i++) { int tmpColumn = rnd.Next(0, size - 1); for (int j = 0; j < size; j++) { if (j == tmpColumn) { arrray[i, j] = 1;//每一行至少有一个元素为1,每个人至少认识一个人 } else { arrray[i, j] = rnd.Next(100) % 2; } } } //构造一个名流 for (int i = 0; i < size; i++) { arrray[celebrateIndex, i] = 0; //Celebrity know nobody. arrray[i, celebrateIndex] = 1;//Everybody knows the Celebrity. } return arrray; }
2.求解名人,分两步,第一步排除所有非名人,第二步判断剩下的候选者是否为名人。
public static bool FindCelebrity(int[,] knowArray, ref int celebrityIndex) { if (knowArray == null) throw new ArgumentNullException("knowArray"); if (knowArray.GetUpperBound(0) != knowArray.GetUpperBound(1)) throw new Exception("A square matrix is required."); int i = 0;//candidate for (int j = 1; j <= knowArray.GetUpperBound(0); j++) { if (knowArray[i, j] == 1)//i know j i = j; } bool result = true; for (int j = 0; j <= knowArray.GetUpperBound(0); j++) { if (i == j) continue; if (knowArray[i, j] == 1 || knowArray[j, i] == 0)//i know j { result = false; break; } } if (result) { celebrityIndex = i; } else { celebrityIndex = -1; } return result; } }
运行结果:
下载源码。
作者:Andy Zeng
欢迎任何形式的转载,但请务必注明出处。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· 《HelloGitHub》第 108 期
· MQ 如何保证数据一致性?
· 一个基于 .NET 开源免费的异地组网和内网穿透工具