每天打卡一小时 第十七天 编译四部曲
第一部曲 自然语言
路线图分块,能走通的节点合并为一块,记块的总数为num1。然后去掉一个节点后,再次分块,记块的总数为num2。如果num2-1(去掉了单独的一个节点)与num1相等或num2(去掉该节点之后,该节点所在的块仍互通)等于num1,则不影响连通性。
第二部曲 流程图
第三部曲 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | #include<iostream> using namespace std; int father[501]; int N,M; int visit[501]; struct data{ //记道路 int x; int y; }; int find( int x){ while (father[x] != x){ x = father[x]; } return x; } void add( int x, int y){ int x1 = find(x); int y1 = find(y); if (x1 != y1){ father[x1] = y1; } } int main(){ cin>>N>>M; int a,b; struct data node [M]; for ( int i=0;i<N;i++){ father[i] = i; } for ( int i=0;i<M;i++){ cin>>a>>b; node[i].x = a; node[i].y = b; add(a,b); //合并节点,将可以连通的节点合并 } int num1 = 0; for ( int i=0;i<N;i++){ if (father[i] == i){ num1++; //统计块的个数 } } int K; cin>>K; int n; for ( int j=0;j<K;j++){ cin>>n; //重新计算num for ( int i=0;i<N;i++){ father[i] = i; } visit[n] = 1; //这个数组的作用是,标记删除过的节点 for ( int i=0;i<M;i++){ if (visit[node[i].x] == 1 || visit[node[i].y] == 1){ continue ; //结束本次循环,进行下次循环 } add(node[i].x,node[i].y); //合并没有被删除过的节点 } int num2 = 0; for ( int i=0;i<N;i++){ if (father[i] == i){ num2++; } } if (num2-1 == num1 || num2 == num1){ cout<< "City " <<n<< " is lost." <<endl; } else { cout<< "Red Alert: City " <<n<< " is lost!" <<endl; } num1 = num2; } if (K >= N)cout<< "Game Over." <<endl; return 0; } |
第四部曲 总结
看着人家的代码写出来的,好难
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix