1013 Battle Over Cities (25分) DFS | 并查集
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 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 Specification:
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 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个城市之间的路径,假如其中有一座城市被摧毁了,需要另外修多少条路使得其它城市是连通的
题解:
一、
用二维数组存图,使用DFS遍历联通的集合有多少个
二、先用数组a[],b[]存m条路径的端点城市(a,b数组的大小必须大于10^6,否则会段错误),然后在k次询问的时候建立并查集(在建立并查集的时候依次剔除摧毁的城市x),用并查集找联通集合的个数。
注意:使用cin/cout会超时,必须用scanf和printf,
DFS
- #include<iostream>
- #include<cstdio>
- #include<vector>
- #include<cstring>
- #include<stack>
- #include<algorithm>
- #include<map>
- #include<string.h>
- #include<string>
- #define MAX 1000000
- #define ll long long
- using namespace std;
- int a[][],vis[];
- int n,m,k;
- void dfs(int x)
- {
- vis[x]=;
- for(int i=;i<=n;i++)
- {
- if(vis[i]==&&a[x][i]==)
- dfs(i);
- }
- }
- int main()
- {
- //cin>>n>>m>>k; 使用cin会超时
- scanf("%d %d %d",&n,&m,&k);
- int s,e;
- for(int i=;i<m;i++)
- {
- //cin>>s>>e;
- scanf("%d%d",&s,&e);
- a[s][e]=a[e][s]=;
- }
- for(int i=;i<k;i++)
- {
- int x,cnt=;
- //cin>>x;
- scanf("%d",&x);
- memset(vis,,sizeof(vis));
- vis[x]=;
- for(int j=;j<=n;j++)
- {
- if(vis[j]==)
- {
- cnt++;
- dfs(j);
- }
- }
- //cout<<cnt-1<<endl;
- printf("%d\n",cnt-);
- }
- return ;
- }
并查集
- #include<iostream>
- #include<cstdio>
- #include<vector>
- #include<cstring>
- #include<stack>
- #include<algorithm>
- #include<map>
- #include<string.h>
- #include<string>
- #define MAX 1000000
- #define ll long long
- using namespace std;
- int p[],r[],a[],b[];
- int n,m,k;
- void init()//初始化集合,每个元素的老板都是自己
- {
- for (int i = ; i <= n; i++)
- {
- p[i] = i;
- }
- }
- int find(int x)//查找元素x的老板是谁
- {
- if (x == p[x])
- return x;
- else
- return p[x] = find(p[x]);
- }
- void join(int x, int y)//合并两个集合
- {
- int xRoot = find(x);
- int yRoot = find(y);
- if (xRoot == yRoot) //老板相同,不合并
- return;
- //cnt=cnt-1;
- if (r[xRoot] < r[yRoot]) //r[i]是元素i所在树的高度,矮树的根节点认高树的根节点做老板
- p[xRoot] = yRoot;
- else if (r[xRoot] > r[yRoot])
- p[yRoot] = xRoot;
- else
- {
- p[yRoot] = xRoot;//树高相同,做老板的树高度要加一
- r[xRoot]++;
- }
- }
- int main()
- {
- cin>>n>>m>>k;
- for(int i=;i<m;i++)//存边
- scanf("%d%d",&a[i],&b[i]);
- for(int i=;i<k;i++)
- {
- init();
- int x;
- scanf("%d",&x);
- for(int j=;j<m;j++)
- {
- if(a[j]==x||b[j]==x)//在建立并查集的时候剔除点x
- continue;
- else
- {
- if(find(a[j])!=find(b[j]))
- join(a[j],b[j]);
- }
- }
- int cnt=;
- for(int j=;j<=n;j++)
- {
- if(p[j]==j)
- cnt++;
- }
- printf("%d\n",cnt-);//剔除的那个点也会独立成一个集合,所以要减2
- }
- return ;
- }
1013 Battle Over Cities (25分) DFS | 并查集的更多相关文章
- 【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
题目 It is vitally important to have all the cities connected by highways in a war. If a city is occup ...
- 1013. Battle Over Cities (25)(DFS遍历)
For example, if we have 3 cities and 2 highways connecting city1-city2 and city1-city3. Then if city ...
- PAT-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 occupied ...
- 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 ...
- PAT 解题报告 1013. Battle Over Cities (25)
1013. Battle Over Cities (25) t is vitally important to have all the cities connected by highways in ...
- pat 1013 Battle Over Cities(25 分) (并查集)
1013 Battle Over Cities(25 分) It is vitally important to have all the cities connected by highways i ...
- 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 ...
随机推荐
- 每天进步一点点------SOPC的Avalon-MM IP核(四) KEY_LED IP定制
/********************************************************************************* * Company : * Eng ...
- Yii2 的 updateAll 方法参数详解
Yii2 中的 updateAll() 可以接受三个参数,$attributes, $condition, $params = null 第一个参数是要更新的值,第二个是条件,如果第二个条件中用了占位 ...
- Springmvc-crud-01错误
错误:无法显示图书列表内容 原因:获取存储域对象中的名字写错了 controller层: 前端页面: 解决方案:前后端的代码要保持一致(名字自己定义),写代码要细心 修改成功后的界面
- 6_4 破损的键盘(UVa11988)<链表>
你用了一个有点坏掉的键盘打字,该键盘会自动按下”Home”键与“End”键,直到打完整个内容以前,你都没有发现到这个问题.本题给定键盘输出的字串(包含Home与End),请你输出该字串在屏幕显示的内容 ...
- Atcoder Beginner Contest145E(01背包记录路径)
#define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;int a[3007],b[3007];int ...
- easyapi用法
https://www.easyapi.com/api/?documentId=1773&themeId=
- 迷のbug
已解决(ps over%100写错了,应该是over/100...) #include <bits/stdc++.h> #define rep(i, a, b) for(int i = a ...
- 连接数据库报错Access denied for user 'root'@'localhost' (using password:YES)
报错信息为:pymysql.err.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using pa ...
- HTML 入门第一课
HTML 简单认识 HTML(HyperText Markup Language)即超文本标记语言,是一种用来制作超文本文档的简单标记语言,也是制作网页的最基本的语言,它可以直接由浏览器执行. 1.H ...
- typo3 安装
接到新任务,迁移typo3,可是我都没听说过这个是啥啊?怎么办?先装一个试试呗,听说这个是一个比较高端的一个cms,在国外挺流行的,国内就算了吧,毕竟我们又太多的cms了,哈哈哈,ok安装. 1.确定 ...