1013 Battle Over Cities(图的DFS解法)
这题的背景是战争年代,假如城市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解法)相关推荐
- 1013 Battle Over Cities(并查集解法)
关于背景的介绍见1013 Battle Over Cities(图的DFS解法) DFS就是不算特定结点后数连通子图的总数,再减一.我想着那么并查集就是数不算特定节点后,集合元素(根)的个数.但是我弄 ...
- 1013. Battle Over Cities (25) 连通图
1013. Battle Over Cities (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue It ...
- PAT (Advanced Level) Practise 1013. Battle Over Cities (25)
1013. Battle Over Cities (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue It ...
- PAT甲级1013 Battle Over Cities:[C++题解]并查集、结构体存边
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:并查集题目. 不清楚并查集的小伙伴,请移步并查集原理并查集板子:acwing836. 合并集合. 题意:给定一个连通图,当删掉任意1个 ...
- 【解析】1013 Battle Over Cities (25 分)_31行代码AC
立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 It is vitally important to have all the cities connected by highw ...
- 1034 Head of a Gang(图的DFS解法) 擦边大法好
1.题目的大意是给出很多人(结点)之间的通话记录,每两人之间的权重取决于他俩通话权重的总时长,如果一个社区的人数超过2且社区内发生的通话总时长超过给定阈值,那么这属于一个社区.最后要求输出社区的总数, ...
- 1013 Battle Over Cities
1. 题目 2. 抽象建模 图求连通分量个数 3. 方法 深度优先递归遍历 4. 注意点 无 5.代码 #include<stdio.h> #include<string.h> ...
- 1013 Battle Over Cities (25分)(用割点做)
仅以此题纪念脑瘫的我.好吧看见1000的范围没有多想什么,直接跑了一遍tarjan,md其实暴力就可以...乌鱼子 题解: tarjan记录割点能把图分成几个. tarjan可以适用于1e5数量级别的 ...
- 1013 Battle Over Cities (25 分) 【难度: 中 / 知识点: 连通块】
https://pintia.cn/problem-sets/994805342720868352/problems/994805500414115840 将这些连通块,连接起来最少的边,即是答案. ...
最新文章
- 解决nohup: 忽略输入并把输出追加到“nohup.out“或者nohup: 忽略输入重定向错误到标准输出端
- 进程间通信(1) dll 实现进程的内存共享
- 学习go语言国内最全资料链接
- 如何攻破容器持久化存储挑战?
- MySQL常用存储引擎之Federated
- WEB安全基础-HTML相关知识
- 团队代码规范java,java 开发,适用于团队的代码规范及某些约定
- C++-文件【1】-按行读文本文件的两种方法
- Java编程语言有哪些优势
- 人人商城-人人社区数据字典(数据表)
- STM32 HAL库 结构
- 9.12测试(二)——国际象棋
- python在财务中的应用实训报告-衡南2020年_商务办公软件应用与实践_高校邦_期末答案...
- 青岛科技大学计算机一级报名,2019年3月山东青岛科技大学计算机等级考试报名通知...
- 信息隐藏 !!!!!!!!!!!!!
- 苍蝇也有自己的“领空”吗?
- “甲流疫情死亡率”较标准程序
- 从Hadoop1.0到Hadoop2.0架构的优化和发展探索详解
- php artisan migrate,Laravel php artisan 自动生成Model+Migrate+Controller 命令大全
- python打印hello_Python第一行代码——打印hello world