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 ...
随机推荐
- Linux环境PHP7.0安装
原文地址:http://blog.csdn.net/21aspnet/article/details/47708763 PHP7和HHVM比较 PHP7的在真实场景的性能确实已经和HHVM相当, 在一 ...
- Listener-监听器+ServletContext+ApplicationContext
参考资料 ServletContext和ApplicationContext有什么区别 ServletContext:是web容器的东西, 一个webapp一个, 比session作用范围要大, 从中 ...
- 打造 PHP版本 1password
以前注册很多网站密码都使用简单密码,但是由于今年频繁曝出密码不安全问题,所以要使用更加复杂的密码.但是好多个账号,密码也不能设置成一样的,防止一个被盗全部不安全了,记密码就成了意见很头疼的事情. 在手 ...
- websocket nodejs
Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. W ...
- Struts Upload上传文件
1.Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax.servlet.context.te ...
- QTextCodec::makeDecoder函数,plugins需要是动态链接库
QT中的QString内容使用Unicode作为文本编码.但是实际系统中通常采用的是其他编码,例如GBK,utf8等.为了便于兼容这些格式,QT中还设置了两个字符串类型: QCString类: C类型 ...
- jade编译乱码问题
加上: meta(http-equiv="Content-Type",content="text/html; charset=utf-8")
- 将java.util.Date类型转换成json时,使用JsonValueProcessor将date转换成希望的类型
问题描述: java里面时间类型转换成json数据就成这样了: "createTime":{"date":30,"day":3," ...
- CentOS7 + linux kernel 3.10.94 compile 简记
Linux kernel 一直以其开源著称,可以自己编译选择合适的模块,针对特定的系统可以有不同的编译选项 来源 此次编译的内核版本为3.10.94,从官网www.kernel.org下载而来,自己虚 ...
- javac 错误: 编码GBK的不可映射字符
在java代码中有中文注释,使用javac编译时,出现编码报错. 错误: 编码GBK的不可映射字符 问题原因: 在编译的时候,如果我们没有用-encoding参数指定我们的JAVA源程序的编码格式,则 ...