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 ...
随机推荐
- Windows上python开发--2安装django框架
Windows上python开发--2安装django框架 分类: 服务器后台开发2014-05-17 21:22 2310人阅读 评论(2) 收藏 举报 python django 上一篇文章中讲了 ...
- 会php不回缓存行吗?多重实现
1.普遍缓存技术: 数据缓存:这里所说的数据缓存是指数据库查询PHP缓存机制,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据,并把查询结果序列化后保存到文件中 ...
- empty($w)
<?php $w = ''; var_dump(empty($w)); $w = ' '; var_dump(empty($w)); $w = 0; var_dump(empty($w)); v ...
- synchronized的使用方法
[转自] http://blog.csdn.net/witsmakemen/article/details/6966116 记下来,很重要. Java语言的关键字,当它用来修饰一个方法或者一个代码块的 ...
- epoll 应用
/* * test_bittube.cpp * * Created on: 2015年7月13日 * Author: ting.guit */ #include <bind ...
- php比较加赋值语句
$a=-2;if ($a < 0 && $a = 1) { echo $a;} 输出1 右面的$a=1可不是条件哦,而是赋值
- hbase与mapreduce集成
一:运行给定的案例 1.获取jar包里的方法 2.运行hbase自带的mapreduce程序 lib/hbase-server-0.98.6-hadoop2.jar 3.具体运行 4.运行一个小方法 ...
- php--递归调用
- SQL SERVER中非聚集索引的覆盖,连接,交叉,过滤
1.覆盖索引:select和where中包含的结果集中应存在“非聚集索引列”,这样就不用查找基表了,索引表即可搞定: 2.索引交叉:索引的交叉可以理解成建立多个非聚集索引之间的join,如表实体一 ...
- Ubuntu+Redis主从配置
软件环境: OS:ubuntu-12.04-desktop-amd64 Redis:redis-2.8.13.tar.gz TCL:tcl8.6.2-src.tar.gz VMware:vmware ...