PAT真题(C语言)——1013:Battle Over Cities

本文介绍了作者在解决PAT题目1013:Battle Over Cities时遇到的挑战,探讨了如何从最初的错误思路转向使用深度优先遍历计算最大联通分量。通过改进路径存储方式,从数组转为链表,成功降低时间复杂度并解决了超时问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
这道题可是折磨了我好长时间,果然我还是太菜了。。。
这道题看着就觉得时间复杂度会很高,至少得是个三重循环。
刚开始想的比较简单,就想着判断连接的点是否是度为1,是的话就得多条路,果不其然出问题了(虽然也过了两个测试点……),后来学习了才知道,这得算它的最大联通分量,最大联通分量减一就是结果,而最大联通分量则需要深度优先遍历。
那么捋一捋,首先遍历需要检查的城市,然后将城市设为不可访问,再去遍历已有的城市,从未被访问的城市开始深度遍历,直到所有城市都被访问,整个过程算上递归,妥妥的三重循环。
起初我存路径是简单粗暴的数组存放起始城市号,这样做不是不行,但最后一个测试点过不去,会超时,这是因为这样的话,每一次遍历都会访问所有的路径一次,确实耗时,于是改成了路径链表存放,即每个城市管理一个链表,链表的节点即为与其相连的城市,这样做顺利通过了,不过空间复杂度略高,但我可以接受,嗯!
代码如下:

#include <stdio.h>
#include <stdlib.h>

#define MAX 1002

int N, M, K;
int check[MAX];
int city[MAX] = {
    0 };
int visit[MAX] = {
   0};//0是不可访问,1是可访问

struct pnode{
   
    int city;
    struct pnode *next;
};

struct pnode* map[MAX];

int clearVisit(){
   
    for(int i=1;i<=N
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值