PAT(甲级)1013笔记---测试点0、2未通过
2020-02-06 09:40
337 查看
PAT(甲级)1013笔记—测试点0、2未通过
1. 原题参照PAT官网
战争中非常重要的是让所有的城市被高速公路连接起来,如果一个城市被敌人占领,所有来自/通往这个城市的高速公路都会被截断关闭。我们必须立即知道,如果我们需要保持所有的高速公路能连接剩下全部的城市,给地图上所有有剩余高速公路的城市做标记,你需要迅速告知需要补修几条高速公路。
比如,如果我们有三个城市和两条高速公路连接city1-city2 和city1-city3。那么如果city1被敌人占据,我们必须再修一条高速公路city2-city3。
输入:每个输入有一个测试用例,每个测试用例第一行有3个数字N(<1000),M和K,分别为城市总数,剩余高铁数量,以及多少城市需要检查。之后会有M行列出,每行用两个整数描述一条高速公路,是这条高速公路连接的城市,这个城市是1到N的数字,最后,有一行包含K个数字,表示我们concern关注的城市。
输出:每个K城市,若该城市消失了,我们需要修复几条高速公路。
思路:连通图问题
建立连通图,然后对每个关注的结点,如果删除该节点及其相连的线,可以形成n个连通图,需要建立n-1条公路即可。
2. 生词记录
- emphasizing -v. 强调(emphasize的现在分词)
3. 知识点【& Question】
- 哭了,先说下思路吧,vector<vector E用来表示边,就是E[ i ][ j ]如果是true,就意味着 i 到 j 有高速公路可通行。
- 之后DFS的思路是,遇到concern的点就拒绝通过这个点继续深入,然后经过的点用visit记录下来,把所有的点遍历后,看看用了几次DFS(此处特指一开始用的)。我觉得这个思路莫问题,答案算出来也是对的,但是第0个测试点和第2个测试点始终无法通过,不理解是为什么。
#include<stdio.h> #include<iostream> #include<vector> #include <iomanip> using namespace std; void DFS(vector<bool> &visit, vector<vector<bool>> &E, int index,int nokey) { visit[index] = true; for (int i = 1; i < visit.size(); i++) { if (E[index][i]==true && visit[i]==false&&(i!=nokey))//index到i之间有边且i未被访问 { DFS(visit, E, i, nokey); } } } int main() { //输入一个图 int N, M, K; cin >> N >> M >> K; vector<vector<bool>> E(N + 1);//边 vector<bool> visit(N + 1,false); vector<int> concern(K);//需要考虑的K个结点 //输入要关注的城市节 for (int i = 1; i <= N; i++){ ///初始化容器的时候只有一级,要定义两级 E[i].resize(N + 1); E[i][i] = true; } for (int i = 0; i < M; i++){ int TEMP1, TEMP2; cin >> TEMP1 >> TEMP2; E[TEMP1][TEMP2] = true; E[TEMP2][TEMP1] = true; } for (int j = 0; j < K; j++)///遍历查询关心的节点值 { int TEMP; cin >> TEMP; int caculate = 0; for (int k = 1; k < N; k++)visit[k] = false; for (int no = 1; no <= N;no++)//循环所有的结点 { if (visit[no] == false&&(no!=TEMP)) { DFS(visit, E, no,TEMP); caculate++; } } concern[j]= caculate-1; } for (int j = 0; j < K; j++) { cout << concern[j] << endl; } return 0; }
4. 代码record
这个时候就要屈服于网上大神们的思路而放弃自己的,哭哭TAT ! ! !
啊啊啊啊啊啊啊也是遇到关心的点就拒绝访问,不用考虑跳过,直接把visit[concern [ i ] ]置为true,就可以了,但是我的为啥错捏,为啥捏,我还是不理解。
#include<stdio.h> #include<string> #include<queue> #include<stack> #include<iostream> #include<vector> #include <iomanip> #include<algorithm> using namespace std; #define MAXSIZE 30 void DFS(vector<bool> &visit, vector<vector<bool>> &E, int index) { visit[index] = true; for (int i = 1; i < visit.size(); i++) { if (E[index][i]==true && visit[i]==false)//index到i之间有边且i未被访问 { DFS(visit, E, i); } } } int main() { //输入一个图 int N, M, K; cin >> N >> M >> K; vector<vector<bool>> E(N + 1);//边 vector<bool> visit(N + 1,false); vector<int> concern(K);//需要考虑的K个结点 //输入要关注的城市节 for (int i = 1; i <= N; i++){ ///初始化容器的时候只有一级,要定义两级 E[i].resize(N + 1); E[i][i] = true; } for (int i = 0; i < M; i++){ int TEMP1, TEMP2; cin >> TEMP1 >> TEMP2; E[TEMP1][TEMP2] = E[TEMP2][TEMP1] = true; } for (int i = 0; i < K; i++) { int a; cin >> a; concern[i] = a; } for (int i = 0; i < K; i++) { for (int v = 0; v < visit.size(); v++) { visit[v] = false; } int cnt = 0; //计算图的连通分量 visit[concern[i]] = true; for (int j = 1; j <= N; j++) { if (!visit[j]) { DFS(visit, E, j); cnt++; } } if (i < K - 1) cout << cnt - 1 << endl; else cout << cnt - 1; } return 0; }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- PAT甲级1015笔记记录 测试点3未通过
- 甲级PAT 1013 Battle Over Cities(用cin始终最后一个测试运行超时来看)
- 1079. Total Sales of Supply Chain (25)-PAT甲级真题(测试点未通过)
- PAT甲级真题及训练集(23)--1079. Total Sales of Supply Chain (25)(未全部测试通过,pat24分)
- **甲级PAT1014 Waiting in Line (已经通过全部测试,找到一个奇怪的坑但是不知道为什么,跪求大佬回复)
- PAT(甲级)1014笔记--银行业务问题
- PAT甲级1013
- PAT真题练习(甲级)1013 Battle Over Cities (25 分)
- PAT 乙 1067 试密码(测试通过)
- PAT 1004. Counting Leaves (30)(Java一个测试点未通过 and C++)
- 【note】PAT甲级刷题笔记
- PAT甲级1013
- PAT 乙 1055 集体照 (测试通过)
- PAT 甲级练习 1013
- PAT 1034 Favorite Color Stripe (30)(官网测试通过)
- STM32 ADC笔记单次转换已测试通过
- PAT 乙 1062 最简分数(1测试点未通过)
- PAT-甲级-1013
- centos5.4上安装kamailio-3.1.4笔记 测试通过
- 【深搜】PAT甲级 1013 图 (计算连通分量)、牛客网 连通图、牛客网 欧拉回路、pat甲1079、甲1094