P1394 山上的国度网页链接P1394 山上的国度题目描述有一个神秘的小国坐落在南方的青山之上只有当黄昏时落日耀眼的余晖刺破薄雾的遮拦有机缘者才可看到小山上面的n nn个美丽的村庄。传说这个古老的国家里有m mm条枢纽管道每一条苍老的管道连接着两个村庄千百年来为村民提供水源的流通。n nn个村庄里只有一个水库从有水库的村庄通过这些枢纽管道向其它村庄提供水源。大家都明白水往低处流所有村庄都能得到水库的供水。黄小明就是那个有机缘者同时他也是个偏执狂把小猫绑在一起的那个变态小明他迫切的想要知道水库应该在哪一个村庄你能帮他解决疑惑吗输入格式第一行输入n , m n,mn,mn , m ≤ 300 n,m \leq 300n,m≤300。第二行输入n nn个正整数第i ii个数表示第i ii个村庄的海拔。之后m mm行每行两个数表示这两个村庄之间有一条道路。同海拔之间不能相互流水输出格式若存在这样的村庄输出两行第一行为Oui, jai trouve la solution.第二行为村庄的编号。否则请输出Non。输入输出样例 #1输入 #14 2 1 2 3 4 1 2 3 4输出 #1Non解题思路本题本质是有向无环图的入度分析利用“水往低处流”的规则将无向道路转化为单向有向边通过统计入度为0的节点数量即可快速判断是否存在能覆盖所有村庄的水库。核心原理推导水流只能从高海拔流向低海拔因此每条无向道路对应一条单向有向边由海拔高的村庄指向海拔低的村庄同海拔村庄之间无法流通不产生有效边。转化后的图是严格的有向无环图DAG路径上海拔严格递减不可能形成环路。合法水库的存在性等价于入度为0的节点数量入度为0的节点没有更高的相邻村庄能向它供水是所在连通分量的局部最高点若入度为0的节点多于1个说明存在多个互不连通的局部高点互相之间无法供水不存在能覆盖所有村庄的水库若入度为0的节点恰好1个它就是全局最高点从该点出发可沿有向边到达所有其他村庄是唯一合法的水库位置。算法执行步骤读入村庄数与道路数记录每个村庄的海拔同时标记全局海拔最高的村庄编号。遍历每条道路根据两端海拔高低更新入度低海拔村庄的入度加1同海拔则不做处理。统计所有入度为0的村庄总数。若数量为1输出合法提示与对应村庄编号否则输出Non。算法时间复杂度为O ( n m ) O(nm)O(nm)完全适配n , m ≤ 300 n,m \le 300n,m≤300的数据规模。总结核心逻辑将无向道路按海拔高低转化为单向有向边通过入度为0的节点数量判定是否存在唯一全局最高点该点即为合法水库位置。关键操作海拔比较定向、入度统计、入度零点计数判定。效率保障线性遍历即可完成计算逻辑简洁无冗余运行效率极高。代码简要说明变量定义a数组存储各村庄海拔indug数组存储每个村庄的入度mm记录全局最高海拔num记录最高海拔对应的村庄编号。输入初始化读入 n 和 m依次读取每个村庄的海拔同步更新全局最高海拔与对应村庄编号。入度统计遍历每条道路比较两端村庄的海拔给海拔较低的村庄入度加1海拔相等则跳过不产生有效边。结果判定统计入度为0的村庄总数。若恰好1个输出指定语句与最高村庄编号否则输出Non。输入优化关闭同步流加速输入输出适配常规数据规模。代码内容#includebits/stdc.husingnamespacestd;#defineendl\ntypedeflonglongll;typedefunsignedlonglongull;typedefvectorvectorllvvt;typedefpairll,llpll;constll N1e310;constll INF1e18;constll M1e610;constll mod1e97;ll indug[309],a[309],num0,maxn0,n,m,mm;intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cinnm;for(ll i1;in;i){cina[i];if(mma[i])mma[i],numi;}for(ll i1;im;i){ll l,r;cinlr;if(a[l]a[r])indug[r];elseif(a[r]a[l])indug[l];}ll x0;for(ll i1;in;i)if(indug[i]0)x;if(x1)coutOui, jai trouve la solution.endlnum;elsecoutNon;return0;}