这道题可是折磨了我好长时间,果然我还是太菜了。。。
这道题看着就觉得时间复杂度会很高,至少得是个三重循环。
刚开始想的比较简单,就想着判断连接的点是否是度为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