news 2026/5/30 23:28:17

华为OD机试真题 新系统 C语言实现【寻找孤立水站】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD机试真题 新系统 C语言实现【寻找孤立水站】

寻找孤立水站

更多语言题解可查看:华为OD机试新系统真题 - 寻找孤立水站(C/C++/Py/Java/Js/Go)题解

题目描述

城市供水管道由若干个连接外部的源头水站,以及内部水站、水管组成。 全市共有n nn个水站,编号为0 00n − 1 n-1n1。 供水网络由若干管道连接,管道分为两类:

  • 单向管道 (T y p e TypeType0 00):水流只能从水站u uu流向水站v vv
  • 双向管道 (T y p e TypeType1 11):水流可以在水站u uuv vv之间双向流动。
    受战争影响,城市中的一部分供水管道破裂导致部分水站无法获得供水,我们称为孤立站。
    假设源头站一定有水(非孤立站),请你根据输入的各个水站的联通情况,输出孤立站的列表,从小到大进行排列。

输入描述

n nn:整型,水站数量,水站编号为0 00n − 1 n-1n10 < n ≤ 10000 0 < n \le 100000<n10000
s o u r c e s sourcessources:整型数组,数组元素为源头水站编号;
p i p e s pipespipes:二维数组,数组元素为[ u , v , t y p e ] [u, v, type][u,v,type],表示水站连通关系,其中u , v u, vu,v为水站编号,t y p e typetype为连通类型。

  • [ u , v , 0 ] [u, v, 0][u,v,0]表示:单向管道,水可由u uu流向v vv,不可由v vv流向u uu
  • [ u , v , 1 ] [u, v, 1][u,v,1]表示:双向管道,水可由u uu流向v vv,也可由v vv流向u uu

输出描述

孤立站列表,类型为整型数组,数组元素为孤立站编号,结果从小到大排列。

样例1

输入

5 1 1,0,0 1,2,0

输出

3,4

说明

1 11号为源头站,从1 11号到0 00号和2 22号都有单向流动,3 33号、4 44号为孤立站。

样例2

输入

5 0,1 0,2,0 0,3,0 4,3,0

输出

4

说明

0 00号、1 11号是源头站,0 001 11非孤立站;
0 00号向2 22号和3 33号是单向流通,2 223 33非孤立站;
4 44号向3 33号单向流通,但是无水站向4 44号供水,4 44是孤立站。

样例3

输入

5 0 0,1,1 0,2,1 3,2,1 4,2,1

输出

说明

0 00号站到1 11号、2 22号为双向流通,1 112 22非孤立站;
3 33号、4 44号到2 22号为双向流通,3 334 44非孤立站;
所以系统无孤立站。

题解

思路

思路:BFS

这道题本质是一个多源BFS扩散题。只有从所有源头开始进行BFS扩散,标记访问过的水站。最终未被访问的水站就是独立站。处理逻辑如下:

  1. 根据给出的pipes构建临界图,其中根据type决定构建单项边还是双向边。
  2. 定义visited记录某个站点是否已被访问。
  3. 使用队列模拟BFS扩散,初始将所有源头站加入队列中并标记已访问。接下来就是典型的BFS模板做法,这部分实现可参照下面代码
  4. BFS结束之后,从前往后将visited未访问的站点按顺序加入结果中即可。

code

#include<stdio.h>#include<string.h>#include<stdlib.h>#defineMAXN10005#defineMAXM200005// 邻接表inthead[MAXN];intnxt[MAXM];intto[MAXM];intedgeCnt=0;voidaddEdge(intu,intv){to[edgeCnt]=v;nxt[edgeCnt]=head[u];head[u]=edgeCnt++;}// BFS队列intqueue[MAXN];intvisited[MAXN];// 字符串分割:sourcesintparseSources(char*str,int*sources){intcnt=0;char*token=strtok(str,",\n");while(token){sources[cnt++]=atoi(token);token=strtok(NULL,",\n");}returncnt;}// 解析 pipesvoidparsePipes(char*str,intn){char*token=strtok(str," \n");while(token){intu,v,type;sscanf(token,"%d,%d,%d",&u,&v,&type);if(type==0){// 单向addEdge(u,v);}else{// 双向建边addEdge(u,v);addEdge(v,u);}token=strtok(NULL," \n");}}intmain(){intn;scanf("%d",&n);getchar();charline1[100000],line2[100000],line3[100000];fgets(line1,sizeof(line1),stdin);fgets(line2,sizeof(line2),stdin);fgets(line3,sizeof(line3),stdin);// 初始化memset(head,-1,sizeof(head));intsources[MAXN];intsc=0;// sources 输入if(strlen(line1)>1){sc=parseSources(line1,sources);}// pipes 输入if(strlen(line2)>1){parsePipes(line2,n);}// bfs进行扩散intfront=0,rear=0;// 将所有源放入队列,并标记已访问for(inti=0;i<sc;i++){queue[rear++]=sources[i];visited[sources[i]]=1;}while(front<rear){intcur=queue[front++];for(inti=head[cur];i!=-1;i=nxt[i]){intv=to[i];if(visited[v])continue;visited[v]=1;queue[rear++]=v;}}// 输出孤立站intfirst=1;for(inti=0;i<n;i++){if(!visited[i]){if(!first)printf(",");printf("%d",i);first=0;}}return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 23:27:00

Arm GICv3中断控制器在低功耗状态下的上下文管理

1. GICv3寄存器上下文管理概述在现代Arm SoC系统中&#xff0c;电源管理是一个关键设计考量。系统支持多种低功耗状态&#xff0c;其中Suspend-to-RAM&#xff08;挂起到内存&#xff09;是移动和嵌入式系统中常见的深度睡眠状态。在这种状态下&#xff0c;包括GIC&#xff08;…

作者头像 李华
网站建设 2026/5/30 23:24:07

基于树莓派3B+与RetroPie打造专属复古游戏机:从PCB设计到系统集成

1. 项目概述&#xff1a;打造你的专属复古游戏站 作为一个折腾过好几台复古游戏机的老玩家&#xff0c;我始终觉得&#xff0c;从零开始组装一台能玩遍童年经典游戏的设备&#xff0c;其乐趣远超直接购买成品。市面上虽然有各种迷你复刻主机&#xff0c;但它们要么游戏库固定&a…

作者头像 李华
网站建设 2026/5/30 23:23:00

OpenCore Legacy Patcher完整教程:3步让旧Mac重获新生的终极指南

OpenCore Legacy Patcher完整教程&#xff1a;3步让旧Mac重获新生的终极指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一款功…

作者头像 李华