1013 Battle Over Cities (25 分)
 

It 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 city​1​​-city​2​​ and city​1​​-city​3​​. Then if city​1​​ is occupied by the enemy, we must have 1 highway repaired, that is the highway city​2​​-city​3​​.

Input Specification:

Each input file contains one test case. Each case starts with a line containing 3 numbers N (<), 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 Specification:

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

题目大意:

给出n个城市,城市间有m条路,k个要检查的城市
假如这k个城市被攻占,所有相关的路线全部瘫痪,要使其他城市保持连通,至少需要修缮多少条路

思路:

1.其实这是考察图的问题,删除图的一个节点,是其他节点成为连通图,至少需要添加多少条线

2.添加最少的路线,就是连通分量数-1(例:n个互相独立的连通分量组成一个连通图,只需要连n-1条线就可以)
3.这道题最重要就是求除去图的一个节点后 剩余的连通分量的数目
4.利用邻接矩阵a存储路线,用inq数组表示城市是否被遍历过

5.遍历每一个需要考虑的城市u,去掉与u相连的边,然后用bfs数有几个连通的块(类似于几个水洼)

#include<bits/stdc++.h>
using namespace std;
int N,M,K;
int is_con[][];
vector<int>a[];
int inq[];//用于bfs的标记
queue<int>q;
void clear(queue<int>& q) {//清空队列的快捷操作
queue<int> empty;
swap(empty, q);
}
int bfs(int p)//数数有几个强连通分量
{
memset(inq,,sizeof(inq));
int ans=;
for(int i=;i<=N;i++)//遍历每个城市
{
if(i!=p && inq[i]==)//该城市没被标记过
{
ans++;
clear(q);
q.push(i);inq[i]=;
while(!q.empty())
{
int x=q.front();
q.pop();
//遍历与x相连的点放进队列并标记
for(int j=;j<a[x].size();j++)
{
int y = a[x].at(j);
if(y!=p && is_con[x][y]!= && inq[y]!=) //不是p,连通的,不在队列中
{
q.push(y);inq[y]=;//放入队列并标记
}
}
}
}
}
return ans;
}
int main()
{
cin>>N>>M>>K;
memset(is_con,,sizeof(is_con));
for(int i=;i<=N;i++)
{
a[i].clear();
}
for(int i=;i<=M;i++)
{
int u,v;
cin>>u>>v;
is_con[u][v]=is_con[v][u]=;
a[u].push_back(v);
a[v].push_back(u);
}
for(int i=;i<=K;i++)
{
int u;
cin>>u;
for(int j=;j<a[u].size();j++)//去掉边
{
int v=a[u].at(j);
is_con[u][v]=;
is_con[v][u]=;
}
int ans = bfs(u);
cout<<ans-<<endl;
for(int j=;j<a[u].size();j++)//恢复去掉的边
{
int v=a[u].at(j);
is_con[u][v]=;
is_con[v][u]=;
}
}
return ;
}

PAT 甲级 1013 Battle Over Cities (25 分)(图的遍历,统计强连通分量个数,bfs,一遍就ac啦)的更多相关文章

  1. 1013 Battle Over Cities (25分) 图的连通分量+DFS

    题目 It is vitally important to have all the cities connected by highways in a war. If a city is occup ...

  2. PAT甲级1013. Battle Over Cities

    PAT甲级1013. Battle Over Cities 题意: 将所有城市连接起来的公路在战争中是非常重要的.如果一个城市被敌人占领,所有从这个城市的高速公路都是关闭的.我们必须立即知道,如果我们 ...

  3. 图论 - PAT甲级 1013 Battle Over Cities C++

    PAT甲级 1013 Battle Over Cities C++ It is vitally important to have all the cities connected by highwa ...

  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. 1013 Battle Over Cities (25 分)

    It is vitally important to have all the cities connected by highways in a war. If a city is occupied ...

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

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

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

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

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

  9. PAT 解题报告 1013. Battle Over Cities (25)

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

随机推荐

  1. webSocket的场景应用

    应用场景 服务器更新 前端页面也进行局部刷新,更新服务器端返回的信息 什么是webSocket? 它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对 ...

  2. Codeforces 348 D - Turtles

    D - Turtles 思路: LGV 定理 (Lindström–Gessel–Viennot lemma) 从{\(a_1\),\(a_2\),...,\(a_n\)} 到 {\(b_1\),\( ...

  3. Python 类和对象(2)

    上文讲到 类 = 属性 + 方法 今天来讲一下方法里常见的一个特殊的方法: 名字叫 __init__ 的构造方法 1.特殊的方法 :__init__ 该方法在我们实例化类的时候,python就自动调用 ...

  4. 【数位DP-板子题目】HDU-3555-Bomb- [只要49]

    Bomb Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepted Su ...

  5. 记录一下关于DQN的想法

    下载了几份代码,就两份没有报错通过了 DQN玩FlappyBird https://github.com/yenchenlin/DeepLearningFlappyBird DQN玩Cartpole ...

  6. trie上构建后缀数组

    例题: 往事太多,有时候忘了就忘了吧. 如果有非记不可的,就只能用点附加手段啦! 我们定义一棵往事树是一个 n 个点 n-1 条边的有向无环图,点编号为 1到 n,其中 1 号点被称为是根结点,除根结 ...

  7. 005_linux驱动之_class_device_create函数

    (一)解析class_device_create函数   (二)当我们使用class_create创建一个类之后我们就可以使用class_device_create函数在这个类下面创建一个设备了,cl ...

  8. java.io.ObjectInputStream类详解

    1.public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants分析 ...

  9. Shell 07 项目案例

    案例1:编写一键部署软件脚本 案例2:启动脚本 案例3:编写监控脚本 案例4:编写安全检测脚本 案例5:编写进度显示脚本   一.编写一键部署软件脚本 #!/bin/bash N=$(yum repo ...

  10. Bzoj 1208: [HNOI2004]宠物收养所(splay)

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MB Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收 ...