这题的背景是战争年代,假如城市1被占领,那么所有和城市1相关的公路都要被炸毁,但是这样一来,2和3就不连通了,所以需要补修一条23之间的公路。但是换做城市2或3被占领,1和另一座城市是联通的,并不需要补修公路。

因此这题是求删去一个结点后,剩下的图中的连通子图的数量,再减去1就是最终要求的结果了。

两个犯傻的地方:

1. 我用DFS和邻接表做这题,还开了两个邻接表,一个用于保存和恢复,增加了不少代码量,其实无需真正去“炸毁公路(删除边)”,只要遍历到被占领的城市跳过即可。

2. 由于DFS需要维护一个哈希数组,并在每次遍历前恢复零,但是注意这里城市的编号从1开始,所以调用fill函数的话,一定是下面这样

fill(vis,vis+allCityNum+1,0);//加一必不可少 

第二个参数是数组名+城市的数目+1!!

关于DFS的写法:

之前想着删边的时候,有两类边要删除,假设被占领城市的编号是lostIdx,那么G[lostIdx]所在的向量要整个clear(),其他的i≠lostIdx的G[i]里面如果存在lostIdx也要删除。这两个分别对应dfsTrave()和dfs(int idx)里面的判断

void dfsTrave(){for(int j=1;j<=allCityNum;j++){if(j!=lostIdx&&vis[j]==0){dfs(j);needNum ++;}}
}void dfs(int idx){if(idx==lostIdx)return;else{vis[idx] = 1;for(int i=0;i<G[idx].size();i++){int u = G[idx][i];if(vis[u]==0)dfs(u);}}}

此外:

我是把需要炸毁的城市数目记作-1,进行一次dfs就加一,所以需要判断一开始是不是只有一座城市,不然会输出-1来。

AC代码

#include<cstdio>
#include<map>
#include<set>
#include<string>
#include<cstring>
#include<iostream>
#include<vector>
#include<stack>
#include<queue>
#include<algorithm>
#include<cmath>
typedef long long LL;using namespace std;const int maxn = 1010;//总城市数上限 vector<int> G[maxn];int allCityNum,lostIdx;int needNum = -1;
bool vis[maxn] = {0};void dfs(int idx){if(idx==lostIdx)return;else{vis[idx] = 1;for(int i=0;i<G[idx].size();i++){int u = G[idx][i];if(vis[u]==0)dfs(u);}}}void dfsTrave(){for(int j=1;j<=allCityNum;j++){if(j!=lostIdx&&vis[j]==0){dfs(j);needNum ++;}}
}int main(){int wayNum,lostCityNum;scanf("%d %d %d",&allCityNum,&wayNum,&lostCityNum);for(int i=0;i<wayNum;i++){int ct1,ct2;scanf("%d %d",&ct1,&ct2);G[ct1].push_back(ct2);G[ct2].push_back(ct1);}for(int i=0;i<lostCityNum;i++){scanf("%d",&lostIdx);if(allCityNum == 1){printf("0\n");}else{ //关键操作needNum = -1; fill(vis,vis+allCityNum+1,0);//加一必不可少 dfsTrave();printf("%d\n",needNum);}}return 0;
}

1013 Battle Over Cities(图的DFS解法)相关推荐

  1. 1013 Battle Over Cities(并查集解法)

    关于背景的介绍见1013 Battle Over Cities(图的DFS解法) DFS就是不算特定结点后数连通子图的总数,再减一.我想着那么并查集就是数不算特定节点后,集合元素(根)的个数.但是我弄 ...

  2. 1013. Battle Over Cities (25) 连通图

    1013. Battle Over Cities (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue It ...

  3. PAT (Advanced Level) Practise 1013. Battle Over Cities (25)

    1013. Battle Over Cities (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue It ...

  4. PAT甲级1013 Battle Over Cities:[C++题解]并查集、结构体存边

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:并查集题目. 不清楚并查集的小伙伴,请移步并查集原理并查集板子:acwing836. 合并集合. 题意:给定一个连通图,当删掉任意1个 ...

  5. 【解析】1013 Battle Over Cities (25 分)_31行代码AC

    立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 It is vitally important to have all the cities connected by highw ...

  6. 1034 Head of a Gang(图的DFS解法) 擦边大法好

    1.题目的大意是给出很多人(结点)之间的通话记录,每两人之间的权重取决于他俩通话权重的总时长,如果一个社区的人数超过2且社区内发生的通话总时长超过给定阈值,那么这属于一个社区.最后要求输出社区的总数, ...

  7. 1013 Battle Over Cities

    1. 题目 2. 抽象建模 图求连通分量个数 3. 方法 深度优先递归遍历 4. 注意点 无 5.代码 #include<stdio.h> #include<string.h> ...

  8. 1013 Battle Over Cities (25分)(用割点做)

    仅以此题纪念脑瘫的我.好吧看见1000的范围没有多想什么,直接跑了一遍tarjan,md其实暴力就可以...乌鱼子 题解: tarjan记录割点能把图分成几个. tarjan可以适用于1e5数量级别的 ...

  9. 1013 Battle Over Cities (25 分) 【难度: 中 / 知识点: 连通块】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805500414115840 将这些连通块,连接起来最少的边,即是答案. ...

最新文章

  1. 解决nohup: 忽略输入并把输出追加到“nohup.out“或者nohup: 忽略输入重定向错误到标准输出端
  2. 进程间通信(1) dll 实现进程的内存共享
  3. 学习go语言国内最全资料链接
  4. 如何攻破容器持久化存储挑战?
  5. MySQL常用存储引擎之Federated
  6. WEB安全基础-HTML相关知识
  7. 团队代码规范java,java 开发,适用于团队的代码规范及某些约定
  8. C++-文件【1】-按行读文本文件的两种方法
  9. Java编程语言有哪些优势
  10. 人人商城-人人社区数据字典(数据表)
  11. STM32 HAL库 结构
  12. 9.12测试(二)——国际象棋
  13. python在财务中的应用实训报告-衡南2020年_商务办公软件应用与实践_高校邦_期末答案...
  14. 青岛科技大学计算机一级报名,2019年3月山东青岛科技大学计算机等级考试报名通知...
  15. 信息隐藏 !!!!!!!!!!!!!
  16. 苍蝇也有自己的“领空”吗?
  17. “甲流疫情死亡率”较标准程序
  18. 从Hadoop1.0到Hadoop2.0架构的优化和发展探索详解
  19. php artisan migrate,Laravel php artisan 自动生成Model+Migrate+Controller 命令大全
  20. python打印hello_Python第一行代码——打印hello world

热门文章

  1. 打包 React 项目并在服务器运行。
  2. 微信小程序,对象转换成数组
  3. iOS 实现点击微信头像效果
  4. MXNet动手学深度学习笔记:卷积计算
  5. android随手记
  6. Unity----Scene加载问题
  7. 路由器配置实践 教你如何在Linux中三台主机两个网段互相通信
  8. FutureTask中Treiber堆的实现
  9. JavaBean简单及使用
  10. windows下使用aspell开启emacs的单词拼写检查功能