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. 类型强转(type cast)

    类型转换有 c 风格的,当然还有 c++风格的.c 风格的转换的格式很简单(TYPEEXPRESSION),但是 c 风格的类型转换有不少的缺点,有的时候用 c 风格的转换是不合适的, 因为它可以在任 ...

  2. LR中Vugen的多进程与多线程(脚本命令行)

    Controller使用驱动程序(如mdrv.exe或r3vuser.exe)来运行Vuser.用户可以在Controller的run-time setting中选择Vuser的运行方式:多进程/多线 ...

  3. ubuntu 工作区中拖动一个窗体到另一个工作区就卡住回不到桌面了

    ubuntu 工作区中拖动一个窗体到另一个工作区就卡住回不到桌面了 解决方法: 按 alt + 回车  键直接就返回去了

  4. Apche Kafka 的生与死 – failover 机制详解

    Kafka 作为 high throughput 的消息中间件,以其性能,简单和稳定性,成为当前实时流处理框架中的主流的基础组件. 当然在使用 Kafka 中也碰到不少问题,尤其是 failover ...

  5. 【转】Unity3D开发之Http协议网络通信

    之前unity3d项目要做跟服务器通信的模块,然后服务器那边的协议是基于http的Jsonrpc通信方式一开始,用C#的本身类HttpWebRequest来提交请求,很快就在电脑上面成功了,代码也很简 ...

  6. wsdl 结构

    WSDL文档可以分为两部分.分别是抽象部分和具体描述 部分. 抽象部分 抽象部分以独立于平台和语言的方式定义SOAP消息,它们并不包含任何随 机器或语言而变的元素.<types>.< ...

  7. 蓝牙的Baseband说明

    蓝牙的radio部分使用2.4GHz的ISM段,2400 - 2483.5 MHz,通道间隔1MHz,GFS调制,采用跳频技术,每秒至少1600次.连接完成后的跳频次数为1600次/s,在inquir ...

  8. XCode中的单元测试:编写测试类和方法(内容意译自苹果官方文档)

    当你在工程中通过测试导航栏添加了一个测试target之后, xcode会在测试导航栏中显示该target所属的测试类和方法. 这一章演示了怎么创建测试类,以及如何编写测试方法. 测试targets, ...

  9. Java HashMap、LinkedHashMap

    如果需要使用的Map中的key无序,选择HashMap:如果要求key有序,则选择TreeMap. 但是选择TreeMap就会有性能问题,因为TreeMap的get操作的时间复杂度是O(log(n)) ...

  10. Linux下开发Windows平台运行的程序 - MinGW

    开源不乏神人,于是有了MinGW(Minimalist GNU for Windows),又称mingw32,是将GCC编译器和GNU Binutils一直到Win32平台下,包含一系列头文件.库和可 ...