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)的更多相关文章

  1. PAT (Advanced Level) 1013. Battle Over Cities (25)

    并查集判断连通性. #include<iostream> #include<cstring> #include<cmath> #include<algorit ...

  2. 【PAT甲级】1013 Battle Over Cities (25 分)(并查集,简单联通图)

    题意: 输入三个整数N,M,K(N<=1000,第四个数据1e5<=M<=1e6).有1~N个城市,M条高速公路,K次询问,每次询问输入一个被敌军占领的城市,所有和该城市相连的高速公 ...

  3. 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 ...

  4. 1013 Battle Over Cities (25分) DFS | 并查集

    1013 Battle Over Cities (25分)   It is vitally important to have all the cities connected by highways ...

  5. 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 ...

  6. PAT A 1013. Battle Over Cities (25)【并查集】

    https://www.patest.cn/contests/pat-a-practise/1013 思路:并查集合并 #include<set> #include<map> ...

  7. PAT甲题题解-1013. Battle Over Cities (25)-求联通分支个数

    题目就是求联通分支个数删除一个点,剩下联通分支个数为cnt,那么需要建立cnt-1边才能把这cnt个联通分支个数求出来怎么求联通分支个数呢可以用并查集,但并查集的话复杂度是O(m*logn*k)我这里 ...

  8. 【PAT Advanced Level】1013. Battle Over Cities (25)

    这题给定了一个图,我用DFS的思想,来求出在图中去掉某个点后还剩几个相互独立的区域(连通子图). 在DFS中,每遇到一个未访问的点,则对他进行深搜,把它能访问到的所有点标记为已访问.一共进行了多少次这 ...

  9. PAT 解题报告 1052. Linked List Sorting (25)

    1052. Linked List Sorting (25) A linked list consists of a series of structures, which are not neces ...

随机推荐

  1. Bootstrap页面布局19 - BS提示信息

    提示信息的设计 提示信息的类: .alert:提示信息类 .alert alert-danger: .alert alert-error: .alert alert-success: .alert a ...

  2. DDL DML DCL SQL

    https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_ddl SQL The Structured Query Language tha ...

  3. JS删除数组条目中重复的条目

    [腾讯2015春招web前端开发练习卷] 请给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组. Array.prototyp ...

  4. Linux some command(continue...)

    挂载硬盘 sudo mount -t ext4 /dev/sdb1 /media/hadoop 自动挂载相关 sudo blkid sudo fdisk -l vim /etc/fstab cat / ...

  5. nodejs技术面试问题整理

    1.meteor 是如何解决多回调的问题 参考 http://www.cnblogs.com/meteorcn/p/MeteorJS_Async_Fiber_Future_Wrap.html 2.一个 ...

  6. iOS NSURLSession 下载

    周五的时候,有个新的需求,要下载脚本,帮助玩家自动打怪,应该也是挂机的意思吧! 组长让我设计界面,让汤老师设计数据等.我觉得数据的挑战性更大一点,然后就接过来了. 自己还没有形成互联网思维,所以弄了一 ...

  7. SQLServer User and Login Tips

    use master IF EXISTS (SELECT * FROM sys.databases WHERE name = 'gpdb83sp')BEGIN DROP DATABASE gpdb83 ...

  8. 执行shell脚本的几种方法及区别

    执行shell脚本的几种方法及区别 http://blog.csdn.net/lanxinju/article/details/6032368 (认真看) 注意:如果涉及到脚本之间的调用一定要用 . ...

  9. String的类型的数据

    字符串类型的数据也是计算机基础. var box = "lc"; var box1 = 'lc1'; //不管是单引号还双引号,都必须成对出现 1.ECMAscript规定字符串是 ...

  10. js获取时间戳

    1.var now = Date.parse(new Date()); //例:1467342220000 获取的时间戳是把毫秒改成000显示. 2.var now = new Date().valu ...