PAT 解题报告 1013. Battle Over Cities (25)
1013. Battle Over Cities (25)
t is vitally important to have all the cities connected by highways in a war. If a city is occupied by the enemy, all the highways from/toward that city are closed. We must know immediately if we need to repair any other highways to keep the rest of the cities connected. Given the map of cities which have all the remaining highways marked, you are supposed to tell the number of highways need to be repaired, quickly.
For example, if we have 3 cities and 2 highways connecting city1-city2 and city1-city3. Then if city1 is occupied by the enemy, we must have 1 highway repaired, that is the highway city2-city3.
Input
Each input file contains one test case. Each case starts with a line containing 3 numbers N (<1000), M and K, which are the total number of cities, the number of remaining highways, and the number of cities to be checked, respectively. Then M lines follow, each describes a highway by 2 integers, which are the numbers of the cities the highway connects. The cities are numbered from 1 to N. Finally there is a line containing K numbers, which represent the cities we concern.
Output
For each of the K cities, output in a line the number of highways need to be repaired if that city is lost.
Sample Input
3 2 3
1 2
1 3
1 2 3
Sample Output
1
0
0
题意
给定一张图和指定几个点。针对给出的每个点,要求计算,在除掉连接该点的路径的情况下,保证整个图连通所需要添加的边的数量。
分析
计算保证整个图连通需要几个点,亦即求出图中有几个连通分量。两种思路:
- 1.并查集
- 2.DFS
针对每个点,执行算法的过程中,需要注意去除掉该点对应的所有通路。
并查集:
#include<iostream>
#include<cstdio>
//并查集做,AC代码
using namespace std; int n,m,k;
int father[];
int road[][];
//用的巧妙,road[i][0]和road[i][1]表示第i条road的两端
void makeset(int num){
int i;
for(i=;i<=num;i++)
father[i]=i;
}
int findset(int x){
if(x!=father[x]) father[x]=findset(father[x]);
return father[x];
}
void joinset(int x,int y){
x=findset(x);
y=findset(y);
if(x==y) return ;
else{
father[y]=x;
}
} int main(){
freopen("in.txt","r",stdin);
int i,tmp,j;
while(cin>>n>>m>>k){
for(i=;i<m;i++){
cin>>road[i][]>>road[i][];
} for(i=;i<k;i++){
makeset(n);
cin>>tmp;
for(j=;j<m;j++){
if(tmp!=road[j][] && tmp!=road[j][]) joinset(road[j][],road[j][]);
} int num=;
for(j=;j<=n;j++){
if(father[j]==j) num++;
}
cout<<num-<<endl;//去掉一个结点-1,连接-1
}
}
return ;
}
DFS
#include<iostream>
#include<cstdio>
#include<cstring>
//AC了
using namespace std;
int n,m,k;
int mp[][];
int u[]; void dfs(int v){
u[v]=;
int i;
for(i=;i<=n;i++){
if(u[i]== && mp[v][i]>)
dfs(i);
}
}
int dfsTraverse(int s){
int i,cnt=;
memset(u,,sizeof(u)); for(i=;i<=n;i++){
if(mp[i][s]>) mp[i][s]=mp[s][i]=-;
} for(i=;i<=n;i++){
if(i!=s && u[i]==){
dfs(i);
cnt++;
}
} for(i=;i<=n;i++){
if(mp[i][s]<) mp[i][s]=mp[s][i]=;
} return cnt-;
} int main(){
freopen("in.txt","r",stdin);
int i,tmp;
while(cin>>n>>m>>k){
memset(mp,,sizeof(mp));
for(i=;i<m;i++){
int t1,t2;
cin>>t1>>t2;
mp[t1][t2]=mp[t2][t1]=;//这里手误了
}
for(i=;i<k;i++){
cin>>tmp;
int num = dfsTraverse(tmp);
cout<<num<<endl;
}
}
return ;
}
PAT 解题报告 1013. Battle Over Cities (25)的更多相关文章
- PAT (Advanced Level) 1013. Battle Over Cities (25)
并查集判断连通性. #include<iostream> #include<cstring> #include<cmath> #include<algorit ...
- 【PAT甲级】1013 Battle Over Cities (25 分)(并查集,简单联通图)
题意: 输入三个整数N,M,K(N<=1000,第四个数据1e5<=M<=1e6).有1~N个城市,M条高速公路,K次询问,每次询问输入一个被敌军占领的城市,所有和该城市相连的高速公 ...
- PAT 甲级 1013 Battle Over Cities (25 分)(图的遍历,统计强连通分量个数,bfs,一遍就ac啦)
1013 Battle Over Cities (25 分) It is vitally important to have all the cities connected by highway ...
- 1013 Battle Over Cities (25分) DFS | 并查集
1013 Battle Over Cities (25分) It is vitally important to have all the cities connected by highways ...
- PAT Advanced 1013 Battle Over Cities (25) [图的遍历,统计连通分量的个数,DFS,BFS,并查集]
题目 It is vitally important to have all the cities connected by highways in a war. If a city is occup ...
- PAT A 1013. Battle Over Cities (25)【并查集】
https://www.patest.cn/contests/pat-a-practise/1013 思路:并查集合并 #include<set> #include<map> ...
- PAT甲题题解-1013. Battle Over Cities (25)-求联通分支个数
题目就是求联通分支个数删除一个点,剩下联通分支个数为cnt,那么需要建立cnt-1边才能把这cnt个联通分支个数求出来怎么求联通分支个数呢可以用并查集,但并查集的话复杂度是O(m*logn*k)我这里 ...
- 【PAT Advanced Level】1013. Battle Over Cities (25)
这题给定了一个图,我用DFS的思想,来求出在图中去掉某个点后还剩几个相互独立的区域(连通子图). 在DFS中,每遇到一个未访问的点,则对他进行深搜,把它能访问到的所有点标记为已访问.一共进行了多少次这 ...
- PAT 解题报告 1052. Linked List Sorting (25)
1052. Linked List Sorting (25) A linked list consists of a series of structures, which are not neces ...
随机推荐
- laravel 部分路由取消csrf
// app/Http/Middleware/VerifyCsrfToken protected $except = [ 'webhook/*' ];
- Why Stored Procedures?
http://www.w3resource.com/mysql/mysql-procedure.php Stored procedures are fast. MySQL server takes s ...
- (IOS)Swift Music 程序分析
本文主要分享下楼主在学习Swift编程过程中,对GitHub上的一个开源App Swift Music的研究心得. 项目地址:https://github.com/xujiyao123/SwiftMu ...
- VS小技巧
1."清理解决方案":在对程序进行分发.上传时时常需要压缩解决方案文件夹,这时如果还嫌文件太大,可以在VS里右键解决方案---清理解决方.完成后,则该解决方案下的所有项目的将所有中 ...
- 用户登录验证例题用的ajax
1.登录页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...
- JVM学习笔记
1. JVM中的直接引用和符号引用 JVM在装载class文件的时候,会有一步是将符号引用解析为直接引用的过程. 那么这里的直接引用到底是什么呢? 对于指向“类型”[Class对象].类变量.类方法的 ...
- Redis学习笔记--五种数据类型的使用场景
String 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...
- C/C++的编译器|编译环境(非常全面的比较)
C/C++编译器的一些易混淆概念,总结一下. 关于什么是Unix-like操作系统,常见操作系统间差异,什么是操作系统接口等等,请参考<操作系统宝鉴>. C/C++编译器有哪些? 首先是如 ...
- FastMM、FastCode、FastMove的使用(图文并茂)
FastMM是一个替换Embarcadero Delphi Win32应用程序的快速内存管理器,以及可以在多线程下使用,不容易产生内存碎片,并且无需使用外部DLL文件就可以支持共享内存. 使用方法:1 ...
- 安装CentOS Core之后布置环境脚本
#启动ssh服务 service sshd start #安装vim编辑器 echo y | yum install vim #安装网络工具包 echo y | yum install net-too ...